From 1e6846c9b076998712aefff159e8142d85683746 Mon Sep 17 00:00:00 2001
From: vran <vran_dev@foxmail.com>
Date: Tue, 1 Feb 2022 14:07:15 +0800
Subject: [PATCH 1/2] refactor: update primarky logic

---
 .../converter/DocumentPojoConverter.java      |  1 -
 .../data/DatabaseDocumentResponse.java        |  4 +-
 .../dao/tables/TableColumnDocument.java       | 13 ++-
 .../dao/tables/TableIndexDocument.java        | 13 +--
 .../tables/pojos/TableColumnDocumentPojo.java | 19 ++++
 .../tables/pojos/TableIndexDocumentPojo.java  | 19 ----
 .../records/TableColumnDocumentRecord.java    | 94 +++++++++++++------
 .../records/TableIndexDocumentRecord.java     | 86 +++++------------
 .../java/com/databasir/dao/impl/BaseDao.java  |  1 +
 .../main/resources/db/migration/V1__init.sql  |  2 +-
 .../databasir/core/meta/data/ColumnMeta.java  |  1 +
 .../databasir/core/meta/data/IndexMeta.java   |  2 -
 .../impl/jdbc/JdbcColumnMetaRepository.java   | 13 +++
 .../impl/jdbc/JdbcIndexMetaRepository.java    |  1 -
 .../databasir/core/render/RenderConfig.java   |  1 -
 plugin/src/test/java/App.java                 |  2 +-
 plugin/user.md                                |  0
 17 files changed, 141 insertions(+), 131 deletions(-)
 create mode 100644 plugin/user.md

diff --git a/core/src/main/java/com/databasir/core/domain/document/converter/DocumentPojoConverter.java b/core/src/main/java/com/databasir/core/domain/document/converter/DocumentPojoConverter.java
index d4c562f..54d38ff 100644
--- a/core/src/main/java/com/databasir/core/domain/document/converter/DocumentPojoConverter.java
+++ b/core/src/main/java/com/databasir/core/domain/document/converter/DocumentPojoConverter.java
@@ -51,7 +51,6 @@ public interface DocumentPojoConverter extends BaseConverter {
                 .collect(Collectors.toList());
     }
 
-    @Mapping(target = "isPrimary", source = "meta.isPrimaryKey")
     @Mapping(target = "isUnique", source = "meta.isUniqueKey")
     @Mapping(target = "columnNameArray", source = "meta.columnNames")
     TableIndexDocumentPojo toIndexPojo(Integer databaseDocumentId,
diff --git a/core/src/main/java/com/databasir/core/domain/document/data/DatabaseDocumentResponse.java b/core/src/main/java/com/databasir/core/domain/document/data/DatabaseDocumentResponse.java
index 0afe0f1..e7d446e 100644
--- a/core/src/main/java/com/databasir/core/domain/document/data/DatabaseDocumentResponse.java
+++ b/core/src/main/java/com/databasir/core/domain/document/data/DatabaseDocumentResponse.java
@@ -72,6 +72,8 @@ public class DatabaseDocumentResponse {
 
             private String comment;
 
+            private Boolean isPrimaryKey;
+
             private String nullable;
 
             private String autoIncrement;
@@ -91,8 +93,6 @@ public class DatabaseDocumentResponse {
 
             private String name;
 
-            private Boolean isPrimary;
-
             private Boolean isUnique;
 
             @Builder.Default
diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/TableColumnDocument.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/TableColumnDocument.java
index 2672f31..ea326fe 100644
--- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/TableColumnDocument.java
+++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/TableColumnDocument.java
@@ -19,7 +19,7 @@ import org.jooq.Identity;
 import org.jooq.Index;
 import org.jooq.Name;
 import org.jooq.Record;
-import org.jooq.Row12;
+import org.jooq.Row13;
 import org.jooq.Schema;
 import org.jooq.Table;
 import org.jooq.TableField;
@@ -98,6 +98,11 @@ public class TableColumnDocument extends TableImpl<TableColumnDocumentRecord> {
      */
     public final TableField<TableColumnDocumentRecord, Integer> DECIMAL_DIGITS = createField(DSL.name("decimal_digits"), SQLDataType.INTEGER, this, "");
 
+    /**
+     * The column <code>databasir.table_column_document.is_primary_key</code>.
+     */
+    public final TableField<TableColumnDocumentRecord, Boolean> IS_PRIMARY_KEY = createField(DSL.name("is_primary_key"), SQLDataType.BOOLEAN.nullable(false), this, "");
+
     /**
      * The column <code>databasir.table_column_document.nullable</code>. YES,
      * NO, UNKNOWN
@@ -197,11 +202,11 @@ public class TableColumnDocument extends TableImpl<TableColumnDocumentRecord> {
     }
 
     // -------------------------------------------------------------------------
-    // Row12 type methods
+    // Row13 type methods
     // -------------------------------------------------------------------------
 
     @Override
-    public Row12<Integer, Integer, Integer, String, String, String, String, Integer, Integer, String, String, LocalDateTime> fieldsRow() {
-        return (Row12) super.fieldsRow();
+    public Row13<Integer, Integer, Integer, String, String, String, String, Integer, Integer, Boolean, String, String, LocalDateTime> fieldsRow() {
+        return (Row13) super.fieldsRow();
     }
 }
diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/TableIndexDocument.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/TableIndexDocument.java
index a97605a..1d4233d 100644
--- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/TableIndexDocument.java
+++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/TableIndexDocument.java
@@ -20,7 +20,7 @@ import org.jooq.Index;
 import org.jooq.JSON;
 import org.jooq.Name;
 import org.jooq.Record;
-import org.jooq.Row8;
+import org.jooq.Row7;
 import org.jooq.Schema;
 import org.jooq.Table;
 import org.jooq.TableField;
@@ -73,11 +73,6 @@ public class TableIndexDocument extends TableImpl<TableIndexDocumentRecord> {
      */
     public final TableField<TableIndexDocumentRecord, String> NAME = createField(DSL.name("name"), SQLDataType.CLOB.nullable(false), this, "");
 
-    /**
-     * The column <code>databasir.table_index_document.is_primary</code>.
-     */
-    public final TableField<TableIndexDocumentRecord, Boolean> IS_PRIMARY = createField(DSL.name("is_primary"), SQLDataType.BOOLEAN.nullable(false), this, "");
-
     /**
      * The column <code>databasir.table_index_document.is_unique</code>.
      */
@@ -175,11 +170,11 @@ public class TableIndexDocument extends TableImpl<TableIndexDocumentRecord> {
     }
 
     // -------------------------------------------------------------------------
-    // Row8 type methods
+    // Row7 type methods
     // -------------------------------------------------------------------------
 
     @Override
-    public Row8<Integer, Integer, Integer, String, Boolean, Boolean, JSON, LocalDateTime> fieldsRow() {
-        return (Row8) super.fieldsRow();
+    public Row7<Integer, Integer, Integer, String, Boolean, JSON, LocalDateTime> fieldsRow() {
+        return (Row7) super.fieldsRow();
     }
 }
diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/TableColumnDocumentPojo.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/TableColumnDocumentPojo.java
index ca88836..23881c7 100644
--- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/TableColumnDocumentPojo.java
+++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/TableColumnDocumentPojo.java
@@ -25,6 +25,7 @@ public class TableColumnDocumentPojo implements Serializable {
     private String        defaultValue;
     private Integer       size;
     private Integer       decimalDigits;
+    private Boolean       isPrimaryKey;
     private String        nullable;
     private String        autoIncrement;
     private LocalDateTime createAt;
@@ -41,6 +42,7 @@ public class TableColumnDocumentPojo implements Serializable {
         this.defaultValue = value.defaultValue;
         this.size = value.size;
         this.decimalDigits = value.decimalDigits;
+        this.isPrimaryKey = value.isPrimaryKey;
         this.nullable = value.nullable;
         this.autoIncrement = value.autoIncrement;
         this.createAt = value.createAt;
@@ -56,6 +58,7 @@ public class TableColumnDocumentPojo implements Serializable {
         String        defaultValue,
         Integer       size,
         Integer       decimalDigits,
+        Boolean       isPrimaryKey,
         String        nullable,
         String        autoIncrement,
         LocalDateTime createAt
@@ -69,6 +72,7 @@ public class TableColumnDocumentPojo implements Serializable {
         this.defaultValue = defaultValue;
         this.size = size;
         this.decimalDigits = decimalDigits;
+        this.isPrimaryKey = isPrimaryKey;
         this.nullable = nullable;
         this.autoIncrement = autoIncrement;
         this.createAt = createAt;
@@ -204,6 +208,20 @@ public class TableColumnDocumentPojo implements Serializable {
         this.decimalDigits = decimalDigits;
     }
 
+    /**
+     * Getter for <code>databasir.table_column_document.is_primary_key</code>.
+     */
+    public Boolean getIsPrimaryKey() {
+        return this.isPrimaryKey;
+    }
+
+    /**
+     * Setter for <code>databasir.table_column_document.is_primary_key</code>.
+     */
+    public void setIsPrimaryKey(Boolean isPrimaryKey) {
+        this.isPrimaryKey = isPrimaryKey;
+    }
+
     /**
      * Getter for <code>databasir.table_column_document.nullable</code>. YES,
      * NO, UNKNOWN
@@ -263,6 +281,7 @@ public class TableColumnDocumentPojo implements Serializable {
         sb.append(", ").append(defaultValue);
         sb.append(", ").append(size);
         sb.append(", ").append(decimalDigits);
+        sb.append(", ").append(isPrimaryKey);
         sb.append(", ").append(nullable);
         sb.append(", ").append(autoIncrement);
         sb.append(", ").append(createAt);
diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/TableIndexDocumentPojo.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/TableIndexDocumentPojo.java
index 7fd02b8..ceb0fb4 100644
--- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/TableIndexDocumentPojo.java
+++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/TableIndexDocumentPojo.java
@@ -22,7 +22,6 @@ public class TableIndexDocumentPojo implements Serializable {
     private Integer       tableDocumentId;
     private Integer       databaseDocumentId;
     private String        name;
-    private Boolean       isPrimary;
     private Boolean       isUnique;
     private JSON          columnNameArray;
     private LocalDateTime createAt;
@@ -34,7 +33,6 @@ public class TableIndexDocumentPojo implements Serializable {
         this.tableDocumentId = value.tableDocumentId;
         this.databaseDocumentId = value.databaseDocumentId;
         this.name = value.name;
-        this.isPrimary = value.isPrimary;
         this.isUnique = value.isUnique;
         this.columnNameArray = value.columnNameArray;
         this.createAt = value.createAt;
@@ -45,7 +43,6 @@ public class TableIndexDocumentPojo implements Serializable {
         Integer       tableDocumentId,
         Integer       databaseDocumentId,
         String        name,
-        Boolean       isPrimary,
         Boolean       isUnique,
         JSON          columnNameArray,
         LocalDateTime createAt
@@ -54,7 +51,6 @@ public class TableIndexDocumentPojo implements Serializable {
         this.tableDocumentId = tableDocumentId;
         this.databaseDocumentId = databaseDocumentId;
         this.name = name;
-        this.isPrimary = isPrimary;
         this.isUnique = isUnique;
         this.columnNameArray = columnNameArray;
         this.createAt = createAt;
@@ -118,20 +114,6 @@ public class TableIndexDocumentPojo implements Serializable {
         this.name = name;
     }
 
-    /**
-     * Getter for <code>databasir.table_index_document.is_primary</code>.
-     */
-    public Boolean getIsPrimary() {
-        return this.isPrimary;
-    }
-
-    /**
-     * Setter for <code>databasir.table_index_document.is_primary</code>.
-     */
-    public void setIsPrimary(Boolean isPrimary) {
-        this.isPrimary = isPrimary;
-    }
-
     /**
      * Getter for <code>databasir.table_index_document.is_unique</code>.
      */
@@ -182,7 +164,6 @@ public class TableIndexDocumentPojo implements Serializable {
         sb.append(", ").append(tableDocumentId);
         sb.append(", ").append(databaseDocumentId);
         sb.append(", ").append(name);
-        sb.append(", ").append(isPrimary);
         sb.append(", ").append(isUnique);
         sb.append(", ").append(columnNameArray);
         sb.append(", ").append(createAt);
diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/TableColumnDocumentRecord.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/TableColumnDocumentRecord.java
index 9a87151..84f8972 100644
--- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/TableColumnDocumentRecord.java
+++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/TableColumnDocumentRecord.java
@@ -11,8 +11,8 @@ import java.time.LocalDateTime;
 
 import org.jooq.Field;
 import org.jooq.Record1;
-import org.jooq.Record12;
-import org.jooq.Row12;
+import org.jooq.Record13;
+import org.jooq.Row13;
 import org.jooq.impl.UpdatableRecordImpl;
 
 
@@ -20,7 +20,7 @@ import org.jooq.impl.UpdatableRecordImpl;
  * This class is generated by jOOQ.
  */
 @SuppressWarnings({ "all", "unchecked", "rawtypes" })
-public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDocumentRecord> implements Record12<Integer, Integer, Integer, String, String, String, String, Integer, Integer, String, String, LocalDateTime> {
+public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDocumentRecord> implements Record13<Integer, Integer, Integer, String, String, String, String, Integer, Integer, Boolean, String, String, LocalDateTime> {
 
     private static final long serialVersionUID = 1L;
 
@@ -154,12 +154,26 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
         return (Integer) get(8);
     }
 
+    /**
+     * Setter for <code>databasir.table_column_document.is_primary_key</code>.
+     */
+    public void setIsPrimaryKey(Boolean value) {
+        set(9, value);
+    }
+
+    /**
+     * Getter for <code>databasir.table_column_document.is_primary_key</code>.
+     */
+    public Boolean getIsPrimaryKey() {
+        return (Boolean) get(9);
+    }
+
     /**
      * Setter for <code>databasir.table_column_document.nullable</code>. YES,
      * NO, UNKNOWN
      */
     public void setNullable(String value) {
-        set(9, value);
+        set(10, value);
     }
 
     /**
@@ -167,7 +181,7 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
      * NO, UNKNOWN
      */
     public String getNullable() {
-        return (String) get(9);
+        return (String) get(10);
     }
 
     /**
@@ -175,7 +189,7 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
      * YES, NO, UNKNOWN
      */
     public void setAutoIncrement(String value) {
-        set(10, value);
+        set(11, value);
     }
 
     /**
@@ -183,21 +197,21 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
      * YES, NO, UNKNOWN
      */
     public String getAutoIncrement() {
-        return (String) get(10);
+        return (String) get(11);
     }
 
     /**
      * Setter for <code>databasir.table_column_document.create_at</code>.
      */
     public void setCreateAt(LocalDateTime value) {
-        set(11, value);
+        set(12, value);
     }
 
     /**
      * Getter for <code>databasir.table_column_document.create_at</code>.
      */
     public LocalDateTime getCreateAt() {
-        return (LocalDateTime) get(11);
+        return (LocalDateTime) get(12);
     }
 
     // -------------------------------------------------------------------------
@@ -210,17 +224,17 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
     }
 
     // -------------------------------------------------------------------------
-    // Record12 type implementation
+    // Record13 type implementation
     // -------------------------------------------------------------------------
 
     @Override
-    public Row12<Integer, Integer, Integer, String, String, String, String, Integer, Integer, String, String, LocalDateTime> fieldsRow() {
-        return (Row12) super.fieldsRow();
+    public Row13<Integer, Integer, Integer, String, String, String, String, Integer, Integer, Boolean, String, String, LocalDateTime> fieldsRow() {
+        return (Row13) super.fieldsRow();
     }
 
     @Override
-    public Row12<Integer, Integer, Integer, String, String, String, String, Integer, Integer, String, String, LocalDateTime> valuesRow() {
-        return (Row12) super.valuesRow();
+    public Row13<Integer, Integer, Integer, String, String, String, String, Integer, Integer, Boolean, String, String, LocalDateTime> valuesRow() {
+        return (Row13) super.valuesRow();
     }
 
     @Override
@@ -269,17 +283,22 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
     }
 
     @Override
-    public Field<String> field10() {
-        return TableColumnDocument.TABLE_COLUMN_DOCUMENT.NULLABLE;
+    public Field<Boolean> field10() {
+        return TableColumnDocument.TABLE_COLUMN_DOCUMENT.IS_PRIMARY_KEY;
     }
 
     @Override
     public Field<String> field11() {
+        return TableColumnDocument.TABLE_COLUMN_DOCUMENT.NULLABLE;
+    }
+
+    @Override
+    public Field<String> field12() {
         return TableColumnDocument.TABLE_COLUMN_DOCUMENT.AUTO_INCREMENT;
     }
 
     @Override
-    public Field<LocalDateTime> field12() {
+    public Field<LocalDateTime> field13() {
         return TableColumnDocument.TABLE_COLUMN_DOCUMENT.CREATE_AT;
     }
 
@@ -329,17 +348,22 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
     }
 
     @Override
-    public String component10() {
-        return getNullable();
+    public Boolean component10() {
+        return getIsPrimaryKey();
     }
 
     @Override
     public String component11() {
+        return getNullable();
+    }
+
+    @Override
+    public String component12() {
         return getAutoIncrement();
     }
 
     @Override
-    public LocalDateTime component12() {
+    public LocalDateTime component13() {
         return getCreateAt();
     }
 
@@ -389,17 +413,22 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
     }
 
     @Override
-    public String value10() {
-        return getNullable();
+    public Boolean value10() {
+        return getIsPrimaryKey();
     }
 
     @Override
     public String value11() {
+        return getNullable();
+    }
+
+    @Override
+    public String value12() {
         return getAutoIncrement();
     }
 
     @Override
-    public LocalDateTime value12() {
+    public LocalDateTime value13() {
         return getCreateAt();
     }
 
@@ -458,25 +487,31 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
     }
 
     @Override
-    public TableColumnDocumentRecord value10(String value) {
-        setNullable(value);
+    public TableColumnDocumentRecord value10(Boolean value) {
+        setIsPrimaryKey(value);
         return this;
     }
 
     @Override
     public TableColumnDocumentRecord value11(String value) {
+        setNullable(value);
+        return this;
+    }
+
+    @Override
+    public TableColumnDocumentRecord value12(String value) {
         setAutoIncrement(value);
         return this;
     }
 
     @Override
-    public TableColumnDocumentRecord value12(LocalDateTime value) {
+    public TableColumnDocumentRecord value13(LocalDateTime value) {
         setCreateAt(value);
         return this;
     }
 
     @Override
-    public TableColumnDocumentRecord values(Integer value1, Integer value2, Integer value3, String value4, String value5, String value6, String value7, Integer value8, Integer value9, String value10, String value11, LocalDateTime value12) {
+    public TableColumnDocumentRecord values(Integer value1, Integer value2, Integer value3, String value4, String value5, String value6, String value7, Integer value8, Integer value9, Boolean value10, String value11, String value12, LocalDateTime value13) {
         value1(value1);
         value2(value2);
         value3(value3);
@@ -489,6 +524,7 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
         value10(value10);
         value11(value11);
         value12(value12);
+        value13(value13);
         return this;
     }
 
@@ -506,7 +542,7 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
     /**
      * Create a detached, initialised TableColumnDocumentRecord
      */
-    public TableColumnDocumentRecord(Integer id, Integer tableDocumentId, Integer databaseDocumentId, String name, String type, String comment, String defaultValue, Integer size, Integer decimalDigits, String nullable, String autoIncrement, LocalDateTime createAt) {
+    public TableColumnDocumentRecord(Integer id, Integer tableDocumentId, Integer databaseDocumentId, String name, String type, String comment, String defaultValue, Integer size, Integer decimalDigits, Boolean isPrimaryKey, String nullable, String autoIncrement, LocalDateTime createAt) {
         super(TableColumnDocument.TABLE_COLUMN_DOCUMENT);
 
         setId(id);
@@ -518,6 +554,7 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
         setDefaultValue(defaultValue);
         setSize(size);
         setDecimalDigits(decimalDigits);
+        setIsPrimaryKey(isPrimaryKey);
         setNullable(nullable);
         setAutoIncrement(autoIncrement);
         setCreateAt(createAt);
@@ -539,6 +576,7 @@ public class TableColumnDocumentRecord extends UpdatableRecordImpl<TableColumnDo
             setDefaultValue(value.getDefaultValue());
             setSize(value.getSize());
             setDecimalDigits(value.getDecimalDigits());
+            setIsPrimaryKey(value.getIsPrimaryKey());
             setNullable(value.getNullable());
             setAutoIncrement(value.getAutoIncrement());
             setCreateAt(value.getCreateAt());
diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/TableIndexDocumentRecord.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/TableIndexDocumentRecord.java
index 4c93860..b536948 100644
--- a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/TableIndexDocumentRecord.java
+++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/TableIndexDocumentRecord.java
@@ -12,8 +12,8 @@ import java.time.LocalDateTime;
 import org.jooq.Field;
 import org.jooq.JSON;
 import org.jooq.Record1;
-import org.jooq.Record8;
-import org.jooq.Row8;
+import org.jooq.Record7;
+import org.jooq.Row7;
 import org.jooq.impl.UpdatableRecordImpl;
 
 
@@ -21,7 +21,7 @@ import org.jooq.impl.UpdatableRecordImpl;
  * This class is generated by jOOQ.
  */
 @SuppressWarnings({ "all", "unchecked", "rawtypes" })
-public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocumentRecord> implements Record8<Integer, Integer, Integer, String, Boolean, Boolean, JSON, LocalDateTime> {
+public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocumentRecord> implements Record7<Integer, Integer, Integer, String, Boolean, JSON, LocalDateTime> {
 
     private static final long serialVersionUID = 1L;
 
@@ -83,60 +83,46 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
         return (String) get(3);
     }
 
-    /**
-     * Setter for <code>databasir.table_index_document.is_primary</code>.
-     */
-    public void setIsPrimary(Boolean value) {
-        set(4, value);
-    }
-
-    /**
-     * Getter for <code>databasir.table_index_document.is_primary</code>.
-     */
-    public Boolean getIsPrimary() {
-        return (Boolean) get(4);
-    }
-
     /**
      * Setter for <code>databasir.table_index_document.is_unique</code>.
      */
     public void setIsUnique(Boolean value) {
-        set(5, value);
+        set(4, value);
     }
 
     /**
      * Getter for <code>databasir.table_index_document.is_unique</code>.
      */
     public Boolean getIsUnique() {
-        return (Boolean) get(5);
+        return (Boolean) get(4);
     }
 
     /**
      * Setter for <code>databasir.table_index_document.column_name_array</code>.
      */
     public void setColumnNameArray(JSON value) {
-        set(6, value);
+        set(5, value);
     }
 
     /**
      * Getter for <code>databasir.table_index_document.column_name_array</code>.
      */
     public JSON getColumnNameArray() {
-        return (JSON) get(6);
+        return (JSON) get(5);
     }
 
     /**
      * Setter for <code>databasir.table_index_document.create_at</code>.
      */
     public void setCreateAt(LocalDateTime value) {
-        set(7, value);
+        set(6, value);
     }
 
     /**
      * Getter for <code>databasir.table_index_document.create_at</code>.
      */
     public LocalDateTime getCreateAt() {
-        return (LocalDateTime) get(7);
+        return (LocalDateTime) get(6);
     }
 
     // -------------------------------------------------------------------------
@@ -149,17 +135,17 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
     }
 
     // -------------------------------------------------------------------------
-    // Record8 type implementation
+    // Record7 type implementation
     // -------------------------------------------------------------------------
 
     @Override
-    public Row8<Integer, Integer, Integer, String, Boolean, Boolean, JSON, LocalDateTime> fieldsRow() {
-        return (Row8) super.fieldsRow();
+    public Row7<Integer, Integer, Integer, String, Boolean, JSON, LocalDateTime> fieldsRow() {
+        return (Row7) super.fieldsRow();
     }
 
     @Override
-    public Row8<Integer, Integer, Integer, String, Boolean, Boolean, JSON, LocalDateTime> valuesRow() {
-        return (Row8) super.valuesRow();
+    public Row7<Integer, Integer, Integer, String, Boolean, JSON, LocalDateTime> valuesRow() {
+        return (Row7) super.valuesRow();
     }
 
     @Override
@@ -184,21 +170,16 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
 
     @Override
     public Field<Boolean> field5() {
-        return TableIndexDocument.TABLE_INDEX_DOCUMENT.IS_PRIMARY;
-    }
-
-    @Override
-    public Field<Boolean> field6() {
         return TableIndexDocument.TABLE_INDEX_DOCUMENT.IS_UNIQUE;
     }
 
     @Override
-    public Field<JSON> field7() {
+    public Field<JSON> field6() {
         return TableIndexDocument.TABLE_INDEX_DOCUMENT.COLUMN_NAME_ARRAY;
     }
 
     @Override
-    public Field<LocalDateTime> field8() {
+    public Field<LocalDateTime> field7() {
         return TableIndexDocument.TABLE_INDEX_DOCUMENT.CREATE_AT;
     }
 
@@ -224,21 +205,16 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
 
     @Override
     public Boolean component5() {
-        return getIsPrimary();
-    }
-
-    @Override
-    public Boolean component6() {
         return getIsUnique();
     }
 
     @Override
-    public JSON component7() {
+    public JSON component6() {
         return getColumnNameArray();
     }
 
     @Override
-    public LocalDateTime component8() {
+    public LocalDateTime component7() {
         return getCreateAt();
     }
 
@@ -264,21 +240,16 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
 
     @Override
     public Boolean value5() {
-        return getIsPrimary();
-    }
-
-    @Override
-    public Boolean value6() {
         return getIsUnique();
     }
 
     @Override
-    public JSON value7() {
+    public JSON value6() {
         return getColumnNameArray();
     }
 
     @Override
-    public LocalDateTime value8() {
+    public LocalDateTime value7() {
         return getCreateAt();
     }
 
@@ -308,30 +279,24 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
 
     @Override
     public TableIndexDocumentRecord value5(Boolean value) {
-        setIsPrimary(value);
-        return this;
-    }
-
-    @Override
-    public TableIndexDocumentRecord value6(Boolean value) {
         setIsUnique(value);
         return this;
     }
 
     @Override
-    public TableIndexDocumentRecord value7(JSON value) {
+    public TableIndexDocumentRecord value6(JSON value) {
         setColumnNameArray(value);
         return this;
     }
 
     @Override
-    public TableIndexDocumentRecord value8(LocalDateTime value) {
+    public TableIndexDocumentRecord value7(LocalDateTime value) {
         setCreateAt(value);
         return this;
     }
 
     @Override
-    public TableIndexDocumentRecord values(Integer value1, Integer value2, Integer value3, String value4, Boolean value5, Boolean value6, JSON value7, LocalDateTime value8) {
+    public TableIndexDocumentRecord values(Integer value1, Integer value2, Integer value3, String value4, Boolean value5, JSON value6, LocalDateTime value7) {
         value1(value1);
         value2(value2);
         value3(value3);
@@ -339,7 +304,6 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
         value5(value5);
         value6(value6);
         value7(value7);
-        value8(value8);
         return this;
     }
 
@@ -357,14 +321,13 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
     /**
      * Create a detached, initialised TableIndexDocumentRecord
      */
-    public TableIndexDocumentRecord(Integer id, Integer tableDocumentId, Integer databaseDocumentId, String name, Boolean isPrimary, Boolean isUnique, JSON columnNameArray, LocalDateTime createAt) {
+    public TableIndexDocumentRecord(Integer id, Integer tableDocumentId, Integer databaseDocumentId, String name, Boolean isUnique, JSON columnNameArray, LocalDateTime createAt) {
         super(TableIndexDocument.TABLE_INDEX_DOCUMENT);
 
         setId(id);
         setTableDocumentId(tableDocumentId);
         setDatabaseDocumentId(databaseDocumentId);
         setName(name);
-        setIsPrimary(isPrimary);
         setIsUnique(isUnique);
         setColumnNameArray(columnNameArray);
         setCreateAt(createAt);
@@ -381,7 +344,6 @@ public class TableIndexDocumentRecord extends UpdatableRecordImpl<TableIndexDocu
             setTableDocumentId(value.getTableDocumentId());
             setDatabaseDocumentId(value.getDatabaseDocumentId());
             setName(value.getName());
-            setIsPrimary(value.getIsPrimary());
             setIsUnique(value.getIsUnique());
             setColumnNameArray(value.getColumnNameArray());
             setCreateAt(value.getCreateAt());
diff --git a/dao/src/main/java/com/databasir/dao/impl/BaseDao.java b/dao/src/main/java/com/databasir/dao/impl/BaseDao.java
index 189a92e..961fe53 100644
--- a/dao/src/main/java/com/databasir/dao/impl/BaseDao.java
+++ b/dao/src/main/java/com/databasir/dao/impl/BaseDao.java
@@ -4,6 +4,7 @@ package com.databasir.dao.impl;
 import com.databasir.dao.exception.DataNotExistsException;
 import lombok.RequiredArgsConstructor;
 import org.jooq.*;
+import org.jooq.Record;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.Pageable;
diff --git a/dao/src/main/resources/db/migration/V1__init.sql b/dao/src/main/resources/db/migration/V1__init.sql
index 7e2889b..93e338f 100644
--- a/dao/src/main/resources/db/migration/V1__init.sql
+++ b/dao/src/main/resources/db/migration/V1__init.sql
@@ -167,6 +167,7 @@ CREATE TABLE table_column_document
     default_value        VARCHAR(512)          DEFAULT NULL,
     size                 INT          NOT NULL,
     decimal_digits       INT                   DEFAULT NULL,
+    is_primary_key       BOOLEAN      NOT NULL,
     nullable             VARCHAR(64)  NOT NULL COMMENT 'YES, NO, UNKNOWN',
     auto_increment       VARCHAR(64)  NOT NULL COMMENT 'YES, NO, UNKNOWN',
     create_at            TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -182,7 +183,6 @@ CREATE TABLE table_index_document
     table_document_id    INT       NOT NULL,
     database_document_id INT       NOT NULL,
     name                 TEXT      NOT NULL,
-    is_primary           BOOLEAN   NOT NULL,
     is_unique            BOOLEAN   NOT NULL,
     column_name_array    JSON      NOT NULL,
     create_at            TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
diff --git a/plugin/src/main/java/com/databasir/core/meta/data/ColumnMeta.java b/plugin/src/main/java/com/databasir/core/meta/data/ColumnMeta.java
index 2ee53eb..b3b0e16 100644
--- a/plugin/src/main/java/com/databasir/core/meta/data/ColumnMeta.java
+++ b/plugin/src/main/java/com/databasir/core/meta/data/ColumnMeta.java
@@ -26,4 +26,5 @@ public class ColumnMeta {
 
     private String autoIncrement;
 
+    private Boolean isPrimaryKey;
 }
\ No newline at end of file
diff --git a/plugin/src/main/java/com/databasir/core/meta/data/IndexMeta.java b/plugin/src/main/java/com/databasir/core/meta/data/IndexMeta.java
index 207487b..db700ca 100644
--- a/plugin/src/main/java/com/databasir/core/meta/data/IndexMeta.java
+++ b/plugin/src/main/java/com/databasir/core/meta/data/IndexMeta.java
@@ -15,7 +15,5 @@ public class IndexMeta {
     @Builder.Default
     private List<String> columnNames = Collections.emptyList();
 
-    private Boolean isPrimaryKey;
-
     private Boolean isUniqueKey;
 }
diff --git a/plugin/src/main/java/com/databasir/core/meta/repository/impl/jdbc/JdbcColumnMetaRepository.java b/plugin/src/main/java/com/databasir/core/meta/repository/impl/jdbc/JdbcColumnMetaRepository.java
index fde8ad6..054307a 100644
--- a/plugin/src/main/java/com/databasir/core/meta/repository/impl/jdbc/JdbcColumnMetaRepository.java
+++ b/plugin/src/main/java/com/databasir/core/meta/repository/impl/jdbc/JdbcColumnMetaRepository.java
@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
 import java.sql.Connection;
+import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
@@ -29,6 +30,7 @@ public class JdbcColumnMetaRepository implements ColumnMetaRepository {
         List<ColumnMeta> columnDocs = new ArrayList<>();
         String databaseName = tableCondition.getDatabaseName();
         String tableName = tableCondition.getTableName();
+        List<String> primaryKeyColumns = selectPrimaryKeyColumns(connection.getMetaData(), databaseName, tableName);
         ResultSet columnsResult;
         try {
             columnsResult = connection.getMetaData().getColumns(databaseName, null, tableName, null);
@@ -73,6 +75,7 @@ public class JdbcColumnMetaRepository implements ColumnMetaRepository {
                         .autoIncrement(isAutoIncrement)
                         .comment(columnComment)
                         .defaultValue(defaultValue)
+                        .isPrimaryKey(primaryKeyColumns.contains(columnName))
                         .build();
                 columnDocs.add(columnMeta);
             }
@@ -80,4 +83,14 @@ public class JdbcColumnMetaRepository implements ColumnMetaRepository {
         }
         return columnDocs;
     }
+
+    private List<String> selectPrimaryKeyColumns(DatabaseMetaData meta, String catalog, String tableName) throws SQLException {
+        ResultSet result = meta.getPrimaryKeys(catalog, null, tableName);
+        List<String> columns = new ArrayList<>();
+        while (result.next()) {
+            String columnName = result.getString("COLUMN_NAME");
+            columns.add(columnName);
+        }
+        return columns;
+    }
 }
diff --git a/plugin/src/main/java/com/databasir/core/meta/repository/impl/jdbc/JdbcIndexMetaRepository.java b/plugin/src/main/java/com/databasir/core/meta/repository/impl/jdbc/JdbcIndexMetaRepository.java
index b2ebc38..5d0ded5 100644
--- a/plugin/src/main/java/com/databasir/core/meta/repository/impl/jdbc/JdbcIndexMetaRepository.java
+++ b/plugin/src/main/java/com/databasir/core/meta/repository/impl/jdbc/JdbcIndexMetaRepository.java
@@ -47,7 +47,6 @@ public class JdbcIndexMetaRepository implements IndexMetaRepository {
                 IndexMeta indexMeta = IndexMeta.builder()
                         .name(indexName)
                         .columnNames(columns)
-                        .isPrimaryKey(Objects.equals("PRIMARY", indexName))
                         .isUniqueKey(Objects.equals(nonUnique, false))
                         .build();
                 pojoGroupByName.put(indexName, indexMeta);
diff --git a/plugin/src/main/java/com/databasir/core/render/RenderConfig.java b/plugin/src/main/java/com/databasir/core/render/RenderConfig.java
index 4b614f3..237c8fa 100644
--- a/plugin/src/main/java/com/databasir/core/render/RenderConfig.java
+++ b/plugin/src/main/java/com/databasir/core/render/RenderConfig.java
@@ -57,7 +57,6 @@ public class RenderConfig {
     protected LinkedHashMap<String, Function<IndexMeta, String>> indexTitleAndValueMapping() {
         LinkedHashMap<String, Function<IndexMeta, String>> mapping = new LinkedHashMap<>();
         mapping.put("Name", IndexMeta::getName);
-        mapping.put("IsPrimary", index -> index.getIsPrimaryKey() ? "YES" : "");
         mapping.put("IsUnique", index -> index.getIsUniqueKey() ? "YES" : "");
         mapping.put("Columns", index -> String.join(", ", index.getColumnNames()));
         return mapping;
diff --git a/plugin/src/test/java/App.java b/plugin/src/test/java/App.java
index b81d09f..219b45b 100644
--- a/plugin/src/test/java/App.java
+++ b/plugin/src/test/java/App.java
@@ -33,7 +33,7 @@ public class App {
         // this config is used by mysql
         info.put("useInformationSchema", "true");
 
-        String url = "jdbc:mysql://localhost:3306/patient?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true";
+        String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true";
         return DriverManager.getConnection(url, info);
     }
 }
diff --git a/plugin/user.md b/plugin/user.md
new file mode 100644
index 0000000..e69de29

From 0da06e42e04b7d4bbb6246e82760896a4a497a16 Mon Sep 17 00:00:00 2001
From: vran <vran_dev@foxmail.com>
Date: Tue, 1 Feb 2022 14:10:53 +0800
Subject: [PATCH 2/2] feat: update frontend resource

---
 .gitignore                                                    | 3 ++-
 ...hunk-3bf24d18.e722c805.css => chunk-4935816e.e722c805.css} | 0
 api/src/main/resources/static/index.html                      | 2 +-
 .../resources/static/js/{app.cf623e0d.js => app.51f76bee.js}  | 4 ++--
 .../static/js/{app.cf623e0d.js.map => app.51f76bee.js.map}    | 2 +-
 api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js   | 2 --
 .../main/resources/static/js/chunk-3bf24d18.e5da42ea.js.map   | 1 -
 api/src/main/resources/static/js/chunk-4935816e.627c0115.js   | 2 ++
 .../main/resources/static/js/chunk-4935816e.627c0115.js.map   | 1 +
 9 files changed, 9 insertions(+), 8 deletions(-)
 rename api/src/main/resources/static/css/{chunk-3bf24d18.e722c805.css => chunk-4935816e.e722c805.css} (100%)
 rename api/src/main/resources/static/js/{app.cf623e0d.js => app.51f76bee.js} (98%)
 rename api/src/main/resources/static/js/{app.cf623e0d.js.map => app.51f76bee.js.map} (99%)
 delete mode 100644 api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js
 delete mode 100644 api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js.map
 create mode 100644 api/src/main/resources/static/js/chunk-4935816e.627c0115.js
 create mode 100644 api/src/main/resources/static/js/chunk-4935816e.627c0115.js.map

diff --git a/.gitignore b/.gitignore
index 37f3443..61a9a78 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 .gradle/**
 **/build/**
-.idea/**
\ No newline at end of file
+.idea/**
+**/.DS_Store
\ No newline at end of file
diff --git a/api/src/main/resources/static/css/chunk-3bf24d18.e722c805.css b/api/src/main/resources/static/css/chunk-4935816e.e722c805.css
similarity index 100%
rename from api/src/main/resources/static/css/chunk-3bf24d18.e722c805.css
rename to api/src/main/resources/static/css/chunk-4935816e.e722c805.css
diff --git a/api/src/main/resources/static/index.html b/api/src/main/resources/static/index.html
index 2af0ced..8b5d639 100644
--- a/api/src/main/resources/static/index.html
+++ b/api/src/main/resources/static/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>databasir-frontend</title><link href="/css/chunk-1b2e2587.a5b9f9ad.css" rel="prefetch"><link href="/css/chunk-3bf24d18.e722c805.css" rel="prefetch"><link href="/css/chunk-7efe8be4.a5cbc9e6.css" rel="prefetch"><link href="/css/chunk-bf93911a.ab54ac4c.css" rel="prefetch"><link href="/js/chunk-1b2e2587.2a26d5cb.js" rel="prefetch"><link href="/js/chunk-2d0cc811.feb081c8.js" rel="prefetch"><link href="/js/chunk-3bf24d18.e5da42ea.js" rel="prefetch"><link href="/js/chunk-48cebeac.b43a95b4.js" rel="prefetch"><link href="/js/chunk-7efe8be4.e8bbd745.js" rel="prefetch"><link href="/js/chunk-9622a6d8.c20b1f79.js" rel="prefetch"><link href="/js/chunk-abb10c56.4c323350.js" rel="prefetch"><link href="/js/chunk-bf93911a.d40185ff.js" rel="prefetch"><link href="/js/chunk-fffb1b64.df1e960f.js" rel="prefetch"><link href="/css/app.56c172b4.css" rel="preload" as="style"><link href="/css/chunk-vendors.d4aa889d.css" rel="preload" as="style"><link href="/js/app.cf623e0d.js" rel="preload" as="script"><link href="/js/chunk-vendors.ebe2dc88.js" rel="preload" as="script"><link href="/css/chunk-vendors.d4aa889d.css" rel="stylesheet"><link href="/css/app.56c172b4.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but databasir-frontend doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.ebe2dc88.js"></script><script src="/js/app.cf623e0d.js"></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>databasir-frontend</title><link href="/css/chunk-1b2e2587.a5b9f9ad.css" rel="prefetch"><link href="/css/chunk-4935816e.e722c805.css" rel="prefetch"><link href="/css/chunk-7efe8be4.a5cbc9e6.css" rel="prefetch"><link href="/css/chunk-bf93911a.ab54ac4c.css" rel="prefetch"><link href="/js/chunk-1b2e2587.2a26d5cb.js" rel="prefetch"><link href="/js/chunk-2d0cc811.feb081c8.js" rel="prefetch"><link href="/js/chunk-48cebeac.b43a95b4.js" rel="prefetch"><link href="/js/chunk-4935816e.627c0115.js" rel="prefetch"><link href="/js/chunk-7efe8be4.e8bbd745.js" rel="prefetch"><link href="/js/chunk-9622a6d8.c20b1f79.js" rel="prefetch"><link href="/js/chunk-abb10c56.4c323350.js" rel="prefetch"><link href="/js/chunk-bf93911a.d40185ff.js" rel="prefetch"><link href="/js/chunk-fffb1b64.df1e960f.js" rel="prefetch"><link href="/css/app.56c172b4.css" rel="preload" as="style"><link href="/css/chunk-vendors.d4aa889d.css" rel="preload" as="style"><link href="/js/app.51f76bee.js" rel="preload" as="script"><link href="/js/chunk-vendors.ebe2dc88.js" rel="preload" as="script"><link href="/css/chunk-vendors.d4aa889d.css" rel="stylesheet"><link href="/css/app.56c172b4.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but databasir-frontend doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.ebe2dc88.js"></script><script src="/js/app.51f76bee.js"></script></body></html>
\ No newline at end of file
diff --git a/api/src/main/resources/static/js/app.cf623e0d.js b/api/src/main/resources/static/js/app.51f76bee.js
similarity index 98%
rename from api/src/main/resources/static/js/app.cf623e0d.js
rename to api/src/main/resources/static/js/app.51f76bee.js
index a75c38e..adb69f5 100644
--- a/api/src/main/resources/static/js/app.cf623e0d.js
+++ b/api/src/main/resources/static/js/app.51f76bee.js
@@ -1,2 +1,2 @@
-(function(e){function t(t){for(var r,o,u=t[0],i=t[1],l=t[2],s=0,d=[];s<u.length;s++)o=u[s],Object.prototype.hasOwnProperty.call(c,o)&&c[o]&&d.push(c[o][0]),c[o]=0;for(r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r]);b&&b(t);while(d.length)d.shift()();return a.push.apply(a,l||[]),n()}function n(){for(var e,t=0;t<a.length;t++){for(var n=a[t],r=!0,o=1;o<n.length;o++){var u=n[o];0!==c[u]&&(r=!1)}r&&(a.splice(t--,1),e=i(i.s=n[0]))}return e}var r={},o={app:0},c={app:0},a=[];function u(e){return i.p+"js/"+({}[e]||e)+"."+{"chunk-48cebeac":"b43a95b4","chunk-1b2e2587":"2a26d5cb","chunk-2d0cc811":"feb081c8","chunk-3bf24d18":"e5da42ea","chunk-7efe8be4":"e8bbd745","chunk-9622a6d8":"c20b1f79","chunk-abb10c56":"4c323350","chunk-bf93911a":"d40185ff","chunk-fffb1b64":"df1e960f"}[e]+".js"}function i(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,i),n.l=!0,n.exports}i.e=function(e){var t=[],n={"chunk-1b2e2587":1,"chunk-3bf24d18":1,"chunk-7efe8be4":1,"chunk-bf93911a":1};o[e]?t.push(o[e]):0!==o[e]&&n[e]&&t.push(o[e]=new Promise((function(t,n){for(var r="css/"+({}[e]||e)+"."+{"chunk-48cebeac":"31d6cfe0","chunk-1b2e2587":"a5b9f9ad","chunk-2d0cc811":"31d6cfe0","chunk-3bf24d18":"e722c805","chunk-7efe8be4":"a5cbc9e6","chunk-9622a6d8":"31d6cfe0","chunk-abb10c56":"31d6cfe0","chunk-bf93911a":"ab54ac4c","chunk-fffb1b64":"31d6cfe0"}[e]+".css",c=i.p+r,a=document.getElementsByTagName("link"),u=0;u<a.length;u++){var l=a[u],s=l.getAttribute("data-href")||l.getAttribute("href");if("stylesheet"===l.rel&&(s===r||s===c))return t()}var d=document.getElementsByTagName("style");for(u=0;u<d.length;u++){l=d[u],s=l.getAttribute("data-href");if(s===r||s===c)return t()}var b=document.createElement("link");b.rel="stylesheet",b.type="text/css",b.onload=t,b.onerror=function(t){var r=t&&t.target&&t.target.src||c,a=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");a.code="CSS_CHUNK_LOAD_FAILED",a.request=r,delete o[e],b.parentNode.removeChild(b),n(a)},b.href=c;var m=document.getElementsByTagName("head")[0];m.appendChild(b)})).then((function(){o[e]=0})));var r=c[e];if(0!==r)if(r)t.push(r[2]);else{var a=new Promise((function(t,n){r=c[e]=[t,n]}));t.push(r[2]=a);var l,s=document.createElement("script");s.charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.src=u(e);var d=new Error;l=function(t){s.onerror=s.onload=null,clearTimeout(b);var n=c[e];if(0!==n){if(n){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;d.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",d.name="ChunkLoadError",d.type=r,d.request=o,n[1](d)}c[e]=void 0}};var b=setTimeout((function(){l({type:"timeout",target:s})}),12e4);s.onerror=s.onload=l,document.head.appendChild(s)}return Promise.all(t)},i.m=e,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var l=window["webpackJsonp"]=window["webpackJsonp"]||[],s=l.push.bind(l);l.push=t,l=l.slice();for(var d=0;d<l.length;d++)t(l[d]);var b=s;a.push([0,"chunk-vendors"]),n()})({0:function(e,t,n){e.exports=n("56d7")},"0135":function(e,t,n){},"56d7":function(e,t,n){"use strict";n.r(t);n("e260"),n("e6cf"),n("cca6"),n("a79d"),n("d3b7"),n("159b"),n("b64b");var r=n("7a23"),o=n("c3a1"),c=n("1ed2"),a=(n("7437"),n("a18c")),u=n("5502"),i=n("5f87"),l=Object(u["a"])({state:function(){var e=i["b"].loadUserLoginData(),t={nickname:null,usernmae:null,email:null};return null!=e&&(t.nickname=e.nickname,t.usernmae=e.usernmae,t.email=e.email),{user:t}},mutations:{userUpdate:function(e,t){t.nickname&&(e.user.nickname=t.nickname),t.usernmae&&(e.user.usernmae=t.usernmae),t.email&&(e.user.email=t.email)}}}),s=l;function d(e,t){var n=Object(r["resolveComponent"])("router-view");return Object(r["openBlock"])(),Object(r["createBlock"])(n)}var b=n("6b0d"),m=n.n(b);const p={},f=m()(p,[["render",d]]);var h=f,j=Object(r["createApp"])(h);Object.keys(c).forEach((function(e){j.component(e,c[e])})),j.directive("require-roles",{mounted:function(e,t){var n=t.value;i["b"].hasAnyRoles(n)||e.parentNode&&e.parentNode.removeChild(e)}}),j.directive("select-more",{updated:function(e,t){var n=e.querySelector(".select-trigger"),r=n.getAttribute("aria-describedby"),o=document.getElementById(r),c=o.querySelector(".el-scrollbar .el-select-dropdown__wrap");c.addEventListener("scroll",(function(){var e=this.scrollHeight-this.scrollTop-1<=this.clientHeight;e&&t.value()}))}}),j.use(s),j.use(o["a"]),j.use(a["a"]),j.mount("#app")},"5f87":function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return u}));n("e9c4"),n("d3b7"),n("d81d");var r="accessToken",o="accessTokenExpireAt",c="userLoginData",a={hasAccessToken:function(){var e=this.loadAccessToken();return e},hasValidAccessToken:function(){var e=this.loadAccessToken(),t=window.localStorage.getItem(o);return e&&t?t>(new Date).getTime():(console.log("warn: not found accessToken and expireAt key"),!1)},saveAccessToken:function(e,t){window.localStorage.setItem(r,e),window.localStorage.setItem(o,t)},loadAccessToken:function(){return window.localStorage.getItem(r)}},u={saveUserLoginData:function(e){window.localStorage.setItem(r,e.accessToken),window.localStorage.setItem(o,e.accessTokenExpireAt),window.localStorage.setItem(c,JSON.stringify(e))},removeUserLoginData:function(){window.localStorage.removeItem(c),window.localStorage.removeItem(r),window.localStorage.removeItem(o)},loadUserLoginData:function(){if(window.localStorage.getItem(c)){var e=window.localStorage.getItem(c);return JSON.parse(e)}return null},hasAnyRoles:function(e){var t=window.localStorage.getItem(c);if(null==t)return!1;var n=JSON.parse(t);return n.roles.map((function(e){return e.groupId?e.role+"?groupId="+e.groupId:e.role})).some((function(t){return e.some((function(e){return e==t}))}))},getRefreshToken:function(){var e=window.localStorage.getItem(c);if(null==e)return null;var t=JSON.parse(e);return t.refreshToken}}},a18c:function(e,t,n){"use strict";n("d3b7"),n("3ca3"),n("ddb0");var r=n("6c02"),o=n("7a23");function c(e,t,n,r,c,a){var u=Object(o["resolveComponent"])("AppNav"),i=Object(o["resolveComponent"])("el-aside"),l=Object(o["resolveComponent"])("Breadcrumb"),s=Object(o["resolveComponent"])("Avatar"),d=Object(o["resolveComponent"])("el-header"),b=Object(o["resolveComponent"])("router-view"),m=Object(o["resolveComponent"])("el-main"),p=Object(o["resolveComponent"])("el-container");return Object(o["openBlock"])(),Object(o["createBlock"])(p,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(i,{class:"databasir-nav"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(u)]})),_:1}),Object(o["createVNode"])(d,{class:"databasir-main-header"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l),Object(o["createVNode"])(s)]})),_:1}),Object(o["createVNode"])(m,{class:"databasir-main"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(p,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(m,{class:"databasir-main-content"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(b)]})),_:1})]})),_:1})]})),_:1})]})),_:1})}var a=Object(o["createElementVNode"])("span",null,"Databasir",-1);function u(e,t,n,r,c,u){var i=Object(o["resolveComponent"])("expand"),l=Object(o["resolveComponent"])("el-icon"),s=Object(o["resolveComponent"])("el-menu-item"),d=Object(o["resolveComponent"])("home-filled"),b=Object(o["resolveComponent"])("el-sub-menu"),m=Object(o["resolveComponent"])("el-menu");return Object(o["openBlock"])(),Object(o["createBlock"])(m,{router:"",collapse:r.isCollapse,mode:"vertical",class:"left-menu"},{default:Object(o["withCtx"])((function(){return[r.isCollapse?(Object(o["openBlock"])(),Object(o["createBlock"])(s,{key:0,onClick:r.expandOrFold,index:"#"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(i)]})),_:1})]})),_:1},8,["onClick"])):Object(o["createCommentVNode"])("",!0),Object(o["createVNode"])(s,{index:"/"},{title:Object(o["withCtx"])((function(){return[a]})),default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(d)]})),_:1})]})),_:1}),(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(r.routes,(function(e,t){return Object(o["openBlock"])(),Object(o["createElementBlock"])(o["Fragment"],{key:t},[r.isShowMenu(e)&&e.children.length>0&&e.children.some((function(e){return!e.hidden}))?(Object(o["openBlock"])(),Object(o["createBlock"])(b,{key:0,index:e.path},{title:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(),Object(o["createBlock"])(Object(o["resolveDynamicComponent"])(e.icon)))]})),_:2},1024),Object(o["createElementVNode"])("span",null,Object(o["toDisplayString"])(e.meta.nav),1)]})),default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(e.children,(function(n,r){return Object(o["openBlock"])(),Object(o["createElementBlock"])(o["Fragment"],{key:t+"-"+r},[n.hidden?Object(o["createCommentVNode"])("",!0):(Object(o["openBlock"])(),Object(o["createBlock"])(s,{key:0,index:e.path+"/"+n.path},{title:Object(o["withCtx"])((function(){return[Object(o["createElementVNode"])("span",null,Object(o["toDisplayString"])(n.meta.nav),1)]})),default:Object(o["withCtx"])((function(){return[n.icon?(Object(o["openBlock"])(),Object(o["createBlock"])(l,{key:0},{default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(),Object(o["createBlock"])(Object(o["resolveDynamicComponent"])(n.icon)))]})),_:2},1024)):Object(o["createCommentVNode"])("",!0)]})),_:2},1032,["index"]))],64)})),128))]})),_:2},1032,["index"])):r.isShowMenu(e)?(Object(o["openBlock"])(),Object(o["createBlock"])(s,{key:1,index:e.path},{title:Object(o["withCtx"])((function(){return[Object(o["createElementVNode"])("span",null,Object(o["toDisplayString"])(e.meta.nav),1)]})),default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(),Object(o["createBlock"])(Object(o["resolveDynamicComponent"])(e.icon)))]})),_:2},1024)]})),_:2},1032,["index"])):Object(o["createCommentVNode"])("",!0)],64)})),128))]})),_:1},8,["collapse"])}var i=n("5f87"),l={setup:function(){var e=Object(o["ref"])(!1),t=Object(r["d"])(),n=t.options.routes,c=function(e){if(e.hidden)return!1;if(e.meta.requireAnyRoles&&e.meta.requireAnyRoles.length>0){var t=i["b"].hasAnyRoles(e.meta.requireAnyRoles);if(!t)return!1}return!0},a=function(){e.value=!e.value};return{isCollapse:e,isShowMenu:c,expandOrFold:a,routes:n}}},s=(n("bc45"),n("6b0d")),d=n.n(s);const b=d()(l,[["render",u]]);var m=b;n("b0c0");function p(e,t,n,r,c,a){var u=Object(o["resolveComponent"])("el-breadcrumb-item"),i=Object(o["resolveComponent"])("el-breadcrumb");return Object(o["openBlock"])(),Object(o["createBlock"])(i,{separator:"/"},{default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(a.breadcrumbs,(function(e,t){return Object(o["openBlock"])(),Object(o["createBlock"])(u,{key:t,to:e.to},{default:Object(o["withCtx"])((function(){return[Object(o["createTextVNode"])(Object(o["toDisplayString"])(e.name),1)]})),_:2},1032,["to"])})),128))]})),_:1})}var f={computed:{breadcrumbs:function(){return"function"===typeof this.$route.meta.breadcrumb?this.$route.meta.breadcrumb(this.$route,this.$store.state):[]}}};const h=d()(f,[["render",p]]);var j=h,O=Object(o["createTextVNode"])("个人中心"),v=Object(o["createTextVNode"])("注销登陆");function k(e,t,n,r,c,a){var u=Object(o["resolveComponent"])("el-avatar"),i=Object(o["resolveComponent"])("el-dropdown-item"),l=Object(o["resolveComponent"])("el-dropdown-menu"),s=Object(o["resolveComponent"])("el-dropdown");return Object(o["openBlock"])(),Object(o["createBlock"])(s,null,{dropdown:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(i,null,{default:Object(o["withCtx"])((function(){return[Object(o["createTextVNode"])(Object(o["toDisplayString"])(a.userNickname),1)]})),_:1}),Object(o["createVNode"])(i,{icon:"user",divided:"",onClick:t[0]||(t[0]=function(e){return a.toProfilePage()})},{default:Object(o["withCtx"])((function(){return[O]})),_:1}),Object(o["createVNode"])(i,{icon:"back",onClick:t[1]||(t[1]=function(e){return a.onLogout()})},{default:Object(o["withCtx"])((function(){return[v]})),_:1})]})),_:1})]})),default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(u,{size:36,src:c.avatarUrl,icon:"avatar"},null,8,["src"])]})),_:1})}var g={data:function(){return{avatarUrl:null}},computed:{userNickname:function(){return this.$store.state.user.nickname}},methods:{onLogout:function(){i["b"].removeUserLoginData(),this.$router.push({path:"/login"})},toProfilePage:function(){this.$router.push({path:"/profile"})}}};const w=d()(g,[["render",k]]);var y=w,C={components:{AppNav:m,Breadcrumb:j,Avatar:y}};n("b76b");const N=d()(C,[["render",c]]);var x=N;function B(){return{name:"首页",to:{path:"/"}}}function S(){return{name:"分组列表",to:{name:"groupListPage"}}}function _(e){var t="分組详情";return e.query.groupName&&(t=e.query.groupName),{name:t,to:{path:"/groups/"+e.params.groupId}}}function E(){return{name:"项目创建",to:{path:"/projects/create"}}}function P(e){var t="项目编辑";return e.query.projectName&&(t=e.query.projectName),{name:t,to:{path:"/projects/"+e.params.projectId+"/edit"}}}function V(e){var t="项目文档";return e.query.projectName&&(t=e.query.projectName),{name:t,to:{path:"/groups/"+e.params.groupId+"/projects"}}}function A(){return{name:"用户列表",to:{path:"/users"}}}function I(){return{name:"个人中心",to:{path:"/profile"}}}function T(){return{name:"邮箱设置",to:{path:"/settings/sysEmail"}}}var q={index:function(){return[B()]},groupList:function(){return[B(),S()]},groupDashboard:function(e,t){return[B(),S(),_(e,t)]},groupProjectCreate:function(e,t){return[B(),S(),_(e,t),E(e)]},groupProjectEdit:function(e,t){return[B(),S(),_(e,t),P(e)]},groupProjectDocument:function(e,t){return[B(),S(),_(e,t),V(e)]},userProfile:function(){return[B(),I()]},userList:function(){return[B(),A()]},sysEmailEdit:function(){return[B(),T()]}},L=q,D=[{path:"/login",component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-bf93911a")]).then(n.bind(null,"a55b"))},hidden:!0,meta:{requireAuth:!1}},{path:"/",hidden:!0,component:x,children:[{path:"",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-7efe8be4")]).then(n.bind(null,"d648"))},meta:{breadcrumb:L.groupList}}]},{path:"/groups",icon:"Collection",component:x,meta:{nav:"分组列表"},children:[{path:"",name:"groupListPage",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-7efe8be4")]).then(n.bind(null,"d648"))},meta:{breadcrumb:L.groupList}},{path:":groupId",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-1b2e2587")]).then(n.bind(null,"3cd5"))},meta:{breadcrumb:L.groupDashboard}},{path:":groupId/projects/:projectId/edit",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-9622a6d8")]).then(n.bind(null,"e958"))},meta:{breadcrumb:L.groupProjectEdit}},{path:":groupId/projects/create",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-9622a6d8")]).then(n.bind(null,"e958"))},meta:{breadcrumb:L.groupProjectCreate}},{path:":groupId/projects/:projectId/documents",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-3bf24d18")]).then(n.bind(null,"0742"))},meta:{breadcrumb:L.groupProjectDocument}}]},{path:"/users",icon:"List",component:x,meta:{nav:"用户中心",requireAnyRoles:["SYS_OWNER"]},children:[{path:"",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-abb10c56")]).then(n.bind(null,"ab3a"))},meta:{breadcrumb:L.userList}}]},{path:"/profile",icon:"User",component:x,meta:{nav:"个人中心",breadcrumb:L.userProfile},children:[{path:"",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-fffb1b64")]).then(n.bind(null,"4a39"))}}]},{path:"/settings",icon:"Setting",component:x,meta:{nav:"系统中心",requireAnyRoles:["SYS_OWNER"]},children:[{path:"sysEmail",icon:"Notification",component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-2d0cc811")]).then(n.bind(null,"4de0"))},meta:{nav:"邮箱设置",breadcrumb:L.sysEmailEdit}},{path:"sysKey",icon:"Key",hidden:"true",component:x,meta:{nav:"系统秘钥",breadcrumb:L.sysKeyEdit}}]}],R=Object(r["a"])({history:Object(r["b"])(),routes:D});R.beforeEach((function(e,t,n){0==e.meta.requireAuth?"/login"==e.path&&i["a"].hasAccessToken()?n(t):n():i["a"].hasAccessToken()?n():n({path:"/login"})})),R.beforeEach((function(e,t,n){!e.query.groupName&&t.query.groupName&&(e.query.groupName=t.query.groupName),!e.query.projectName&&t.query.projectName&&(e.query.projectName=t.query.projectName),n()}));t["a"]=R},b76b:function(e,t,n){"use strict";n("0135")},bc45:function(e,t,n){"use strict";n("c353")},c353:function(e,t,n){}});
-//# sourceMappingURL=app.cf623e0d.js.map
\ No newline at end of file
+(function(e){function t(t){for(var r,o,u=t[0],i=t[1],l=t[2],s=0,d=[];s<u.length;s++)o=u[s],Object.prototype.hasOwnProperty.call(c,o)&&c[o]&&d.push(c[o][0]),c[o]=0;for(r in i)Object.prototype.hasOwnProperty.call(i,r)&&(e[r]=i[r]);b&&b(t);while(d.length)d.shift()();return a.push.apply(a,l||[]),n()}function n(){for(var e,t=0;t<a.length;t++){for(var n=a[t],r=!0,o=1;o<n.length;o++){var u=n[o];0!==c[u]&&(r=!1)}r&&(a.splice(t--,1),e=i(i.s=n[0]))}return e}var r={},o={app:0},c={app:0},a=[];function u(e){return i.p+"js/"+({}[e]||e)+"."+{"chunk-48cebeac":"b43a95b4","chunk-1b2e2587":"2a26d5cb","chunk-2d0cc811":"feb081c8","chunk-4935816e":"627c0115","chunk-7efe8be4":"e8bbd745","chunk-9622a6d8":"c20b1f79","chunk-abb10c56":"4c323350","chunk-bf93911a":"d40185ff","chunk-fffb1b64":"df1e960f"}[e]+".js"}function i(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,i),n.l=!0,n.exports}i.e=function(e){var t=[],n={"chunk-1b2e2587":1,"chunk-4935816e":1,"chunk-7efe8be4":1,"chunk-bf93911a":1};o[e]?t.push(o[e]):0!==o[e]&&n[e]&&t.push(o[e]=new Promise((function(t,n){for(var r="css/"+({}[e]||e)+"."+{"chunk-48cebeac":"31d6cfe0","chunk-1b2e2587":"a5b9f9ad","chunk-2d0cc811":"31d6cfe0","chunk-4935816e":"e722c805","chunk-7efe8be4":"a5cbc9e6","chunk-9622a6d8":"31d6cfe0","chunk-abb10c56":"31d6cfe0","chunk-bf93911a":"ab54ac4c","chunk-fffb1b64":"31d6cfe0"}[e]+".css",c=i.p+r,a=document.getElementsByTagName("link"),u=0;u<a.length;u++){var l=a[u],s=l.getAttribute("data-href")||l.getAttribute("href");if("stylesheet"===l.rel&&(s===r||s===c))return t()}var d=document.getElementsByTagName("style");for(u=0;u<d.length;u++){l=d[u],s=l.getAttribute("data-href");if(s===r||s===c)return t()}var b=document.createElement("link");b.rel="stylesheet",b.type="text/css",b.onload=t,b.onerror=function(t){var r=t&&t.target&&t.target.src||c,a=new Error("Loading CSS chunk "+e+" failed.\n("+r+")");a.code="CSS_CHUNK_LOAD_FAILED",a.request=r,delete o[e],b.parentNode.removeChild(b),n(a)},b.href=c;var m=document.getElementsByTagName("head")[0];m.appendChild(b)})).then((function(){o[e]=0})));var r=c[e];if(0!==r)if(r)t.push(r[2]);else{var a=new Promise((function(t,n){r=c[e]=[t,n]}));t.push(r[2]=a);var l,s=document.createElement("script");s.charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.src=u(e);var d=new Error;l=function(t){s.onerror=s.onload=null,clearTimeout(b);var n=c[e];if(0!==n){if(n){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;d.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",d.name="ChunkLoadError",d.type=r,d.request=o,n[1](d)}c[e]=void 0}};var b=setTimeout((function(){l({type:"timeout",target:s})}),12e4);s.onerror=s.onload=l,document.head.appendChild(s)}return Promise.all(t)},i.m=e,i.c=r,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)i.d(n,r,function(t){return e[t]}.bind(null,r));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/",i.oe=function(e){throw console.error(e),e};var l=window["webpackJsonp"]=window["webpackJsonp"]||[],s=l.push.bind(l);l.push=t,l=l.slice();for(var d=0;d<l.length;d++)t(l[d]);var b=s;a.push([0,"chunk-vendors"]),n()})({0:function(e,t,n){e.exports=n("56d7")},"0135":function(e,t,n){},"56d7":function(e,t,n){"use strict";n.r(t);n("e260"),n("e6cf"),n("cca6"),n("a79d"),n("d3b7"),n("159b"),n("b64b");var r=n("7a23"),o=n("c3a1"),c=n("1ed2"),a=(n("7437"),n("a18c")),u=n("5502"),i=n("5f87"),l=Object(u["a"])({state:function(){var e=i["b"].loadUserLoginData(),t={nickname:null,usernmae:null,email:null};return null!=e&&(t.nickname=e.nickname,t.usernmae=e.usernmae,t.email=e.email),{user:t}},mutations:{userUpdate:function(e,t){t.nickname&&(e.user.nickname=t.nickname),t.usernmae&&(e.user.usernmae=t.usernmae),t.email&&(e.user.email=t.email)}}}),s=l;function d(e,t){var n=Object(r["resolveComponent"])("router-view");return Object(r["openBlock"])(),Object(r["createBlock"])(n)}var b=n("6b0d"),m=n.n(b);const p={},f=m()(p,[["render",d]]);var h=f,j=Object(r["createApp"])(h);Object.keys(c).forEach((function(e){j.component(e,c[e])})),j.directive("require-roles",{mounted:function(e,t){var n=t.value;i["b"].hasAnyRoles(n)||e.parentNode&&e.parentNode.removeChild(e)}}),j.directive("select-more",{updated:function(e,t){var n=e.querySelector(".select-trigger"),r=n.getAttribute("aria-describedby"),o=document.getElementById(r),c=o.querySelector(".el-scrollbar .el-select-dropdown__wrap");c.addEventListener("scroll",(function(){var e=this.scrollHeight-this.scrollTop-1<=this.clientHeight;e&&t.value()}))}}),j.use(s),j.use(o["a"]),j.use(a["a"]),j.mount("#app")},"5f87":function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return u}));n("e9c4"),n("d3b7"),n("d81d");var r="accessToken",o="accessTokenExpireAt",c="userLoginData",a={hasAccessToken:function(){var e=this.loadAccessToken();return e},hasValidAccessToken:function(){var e=this.loadAccessToken(),t=window.localStorage.getItem(o);return e&&t?t>(new Date).getTime():(console.log("warn: not found accessToken and expireAt key"),!1)},saveAccessToken:function(e,t){window.localStorage.setItem(r,e),window.localStorage.setItem(o,t)},loadAccessToken:function(){return window.localStorage.getItem(r)}},u={saveUserLoginData:function(e){window.localStorage.setItem(r,e.accessToken),window.localStorage.setItem(o,e.accessTokenExpireAt),window.localStorage.setItem(c,JSON.stringify(e))},removeUserLoginData:function(){window.localStorage.removeItem(c),window.localStorage.removeItem(r),window.localStorage.removeItem(o)},loadUserLoginData:function(){if(window.localStorage.getItem(c)){var e=window.localStorage.getItem(c);return JSON.parse(e)}return null},hasAnyRoles:function(e){var t=window.localStorage.getItem(c);if(null==t)return!1;var n=JSON.parse(t);return n.roles.map((function(e){return e.groupId?e.role+"?groupId="+e.groupId:e.role})).some((function(t){return e.some((function(e){return e==t}))}))},getRefreshToken:function(){var e=window.localStorage.getItem(c);if(null==e)return null;var t=JSON.parse(e);return t.refreshToken}}},a18c:function(e,t,n){"use strict";n("d3b7"),n("3ca3"),n("ddb0");var r=n("6c02"),o=n("7a23");function c(e,t,n,r,c,a){var u=Object(o["resolveComponent"])("AppNav"),i=Object(o["resolveComponent"])("el-aside"),l=Object(o["resolveComponent"])("Breadcrumb"),s=Object(o["resolveComponent"])("Avatar"),d=Object(o["resolveComponent"])("el-header"),b=Object(o["resolveComponent"])("router-view"),m=Object(o["resolveComponent"])("el-main"),p=Object(o["resolveComponent"])("el-container");return Object(o["openBlock"])(),Object(o["createBlock"])(p,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(i,{class:"databasir-nav"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(u)]})),_:1}),Object(o["createVNode"])(d,{class:"databasir-main-header"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l),Object(o["createVNode"])(s)]})),_:1}),Object(o["createVNode"])(m,{class:"databasir-main"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(p,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(m,{class:"databasir-main-content"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(b)]})),_:1})]})),_:1})]})),_:1})]})),_:1})}var a=Object(o["createElementVNode"])("span",null,"Databasir",-1);function u(e,t,n,r,c,u){var i=Object(o["resolveComponent"])("expand"),l=Object(o["resolveComponent"])("el-icon"),s=Object(o["resolveComponent"])("el-menu-item"),d=Object(o["resolveComponent"])("home-filled"),b=Object(o["resolveComponent"])("el-sub-menu"),m=Object(o["resolveComponent"])("el-menu");return Object(o["openBlock"])(),Object(o["createBlock"])(m,{router:"",collapse:r.isCollapse,mode:"vertical",class:"left-menu"},{default:Object(o["withCtx"])((function(){return[r.isCollapse?(Object(o["openBlock"])(),Object(o["createBlock"])(s,{key:0,onClick:r.expandOrFold,index:"#"},{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(i)]})),_:1})]})),_:1},8,["onClick"])):Object(o["createCommentVNode"])("",!0),Object(o["createVNode"])(s,{index:"/"},{title:Object(o["withCtx"])((function(){return[a]})),default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(d)]})),_:1})]})),_:1}),(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(r.routes,(function(e,t){return Object(o["openBlock"])(),Object(o["createElementBlock"])(o["Fragment"],{key:t},[r.isShowMenu(e)&&e.children.length>0&&e.children.some((function(e){return!e.hidden}))?(Object(o["openBlock"])(),Object(o["createBlock"])(b,{key:0,index:e.path},{title:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(),Object(o["createBlock"])(Object(o["resolveDynamicComponent"])(e.icon)))]})),_:2},1024),Object(o["createElementVNode"])("span",null,Object(o["toDisplayString"])(e.meta.nav),1)]})),default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(e.children,(function(n,r){return Object(o["openBlock"])(),Object(o["createElementBlock"])(o["Fragment"],{key:t+"-"+r},[n.hidden?Object(o["createCommentVNode"])("",!0):(Object(o["openBlock"])(),Object(o["createBlock"])(s,{key:0,index:e.path+"/"+n.path},{title:Object(o["withCtx"])((function(){return[Object(o["createElementVNode"])("span",null,Object(o["toDisplayString"])(n.meta.nav),1)]})),default:Object(o["withCtx"])((function(){return[n.icon?(Object(o["openBlock"])(),Object(o["createBlock"])(l,{key:0},{default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(),Object(o["createBlock"])(Object(o["resolveDynamicComponent"])(n.icon)))]})),_:2},1024)):Object(o["createCommentVNode"])("",!0)]})),_:2},1032,["index"]))],64)})),128))]})),_:2},1032,["index"])):r.isShowMenu(e)?(Object(o["openBlock"])(),Object(o["createBlock"])(s,{key:1,index:e.path},{title:Object(o["withCtx"])((function(){return[Object(o["createElementVNode"])("span",null,Object(o["toDisplayString"])(e.meta.nav),1)]})),default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(),Object(o["createBlock"])(Object(o["resolveDynamicComponent"])(e.icon)))]})),_:2},1024)]})),_:2},1032,["index"])):Object(o["createCommentVNode"])("",!0)],64)})),128))]})),_:1},8,["collapse"])}var i=n("5f87"),l={setup:function(){var e=Object(o["ref"])(!1),t=Object(r["d"])(),n=t.options.routes,c=function(e){if(e.hidden)return!1;if(e.meta.requireAnyRoles&&e.meta.requireAnyRoles.length>0){var t=i["b"].hasAnyRoles(e.meta.requireAnyRoles);if(!t)return!1}return!0},a=function(){e.value=!e.value};return{isCollapse:e,isShowMenu:c,expandOrFold:a,routes:n}}},s=(n("bc45"),n("6b0d")),d=n.n(s);const b=d()(l,[["render",u]]);var m=b;n("b0c0");function p(e,t,n,r,c,a){var u=Object(o["resolveComponent"])("el-breadcrumb-item"),i=Object(o["resolveComponent"])("el-breadcrumb");return Object(o["openBlock"])(),Object(o["createBlock"])(i,{separator:"/"},{default:Object(o["withCtx"])((function(){return[(Object(o["openBlock"])(!0),Object(o["createElementBlock"])(o["Fragment"],null,Object(o["renderList"])(a.breadcrumbs,(function(e,t){return Object(o["openBlock"])(),Object(o["createBlock"])(u,{key:t,to:e.to},{default:Object(o["withCtx"])((function(){return[Object(o["createTextVNode"])(Object(o["toDisplayString"])(e.name),1)]})),_:2},1032,["to"])})),128))]})),_:1})}var f={computed:{breadcrumbs:function(){return"function"===typeof this.$route.meta.breadcrumb?this.$route.meta.breadcrumb(this.$route,this.$store.state):[]}}};const h=d()(f,[["render",p]]);var j=h,O=Object(o["createTextVNode"])("个人中心"),v=Object(o["createTextVNode"])("注销登陆");function k(e,t,n,r,c,a){var u=Object(o["resolveComponent"])("el-avatar"),i=Object(o["resolveComponent"])("el-dropdown-item"),l=Object(o["resolveComponent"])("el-dropdown-menu"),s=Object(o["resolveComponent"])("el-dropdown");return Object(o["openBlock"])(),Object(o["createBlock"])(s,null,{dropdown:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(l,null,{default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(i,null,{default:Object(o["withCtx"])((function(){return[Object(o["createTextVNode"])(Object(o["toDisplayString"])(a.userNickname),1)]})),_:1}),Object(o["createVNode"])(i,{icon:"user",divided:"",onClick:t[0]||(t[0]=function(e){return a.toProfilePage()})},{default:Object(o["withCtx"])((function(){return[O]})),_:1}),Object(o["createVNode"])(i,{icon:"back",onClick:t[1]||(t[1]=function(e){return a.onLogout()})},{default:Object(o["withCtx"])((function(){return[v]})),_:1})]})),_:1})]})),default:Object(o["withCtx"])((function(){return[Object(o["createVNode"])(u,{size:36,src:c.avatarUrl,icon:"avatar"},null,8,["src"])]})),_:1})}var g={data:function(){return{avatarUrl:null}},computed:{userNickname:function(){return this.$store.state.user.nickname}},methods:{onLogout:function(){i["b"].removeUserLoginData(),this.$router.push({path:"/login"})},toProfilePage:function(){this.$router.push({path:"/profile"})}}};const w=d()(g,[["render",k]]);var y=w,C={components:{AppNav:m,Breadcrumb:j,Avatar:y}};n("b76b");const N=d()(C,[["render",c]]);var x=N;function B(){return{name:"首页",to:{path:"/"}}}function S(){return{name:"分组列表",to:{name:"groupListPage"}}}function _(e){var t="分組详情";return e.query.groupName&&(t=e.query.groupName),{name:t,to:{path:"/groups/"+e.params.groupId}}}function E(){return{name:"项目创建",to:{path:"/projects/create"}}}function P(e){var t="项目编辑";return e.query.projectName&&(t=e.query.projectName),{name:t,to:{path:"/projects/"+e.params.projectId+"/edit"}}}function V(e){var t="项目文档";return e.query.projectName&&(t=e.query.projectName),{name:t,to:{path:"/groups/"+e.params.groupId+"/projects"}}}function A(){return{name:"用户列表",to:{path:"/users"}}}function I(){return{name:"个人中心",to:{path:"/profile"}}}function T(){return{name:"邮箱设置",to:{path:"/settings/sysEmail"}}}var q={index:function(){return[B()]},groupList:function(){return[B(),S()]},groupDashboard:function(e,t){return[B(),S(),_(e,t)]},groupProjectCreate:function(e,t){return[B(),S(),_(e,t),E(e)]},groupProjectEdit:function(e,t){return[B(),S(),_(e,t),P(e)]},groupProjectDocument:function(e,t){return[B(),S(),_(e,t),V(e)]},userProfile:function(){return[B(),I()]},userList:function(){return[B(),A()]},sysEmailEdit:function(){return[B(),T()]}},L=q,D=[{path:"/login",component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-bf93911a")]).then(n.bind(null,"a55b"))},hidden:!0,meta:{requireAuth:!1}},{path:"/",hidden:!0,component:x,children:[{path:"",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-7efe8be4")]).then(n.bind(null,"d648"))},meta:{breadcrumb:L.groupList}}]},{path:"/groups",icon:"Collection",component:x,meta:{nav:"分组列表"},children:[{path:"",name:"groupListPage",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-7efe8be4")]).then(n.bind(null,"d648"))},meta:{breadcrumb:L.groupList}},{path:":groupId",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-1b2e2587")]).then(n.bind(null,"3cd5"))},meta:{breadcrumb:L.groupDashboard}},{path:":groupId/projects/:projectId/edit",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-9622a6d8")]).then(n.bind(null,"e958"))},meta:{breadcrumb:L.groupProjectEdit}},{path:":groupId/projects/create",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-9622a6d8")]).then(n.bind(null,"e958"))},meta:{breadcrumb:L.groupProjectCreate}},{path:":groupId/projects/:projectId/documents",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-4935816e")]).then(n.bind(null,"0742"))},meta:{breadcrumb:L.groupProjectDocument}}]},{path:"/users",icon:"List",component:x,meta:{nav:"用户中心",requireAnyRoles:["SYS_OWNER"]},children:[{path:"",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-abb10c56")]).then(n.bind(null,"ab3a"))},meta:{breadcrumb:L.userList}}]},{path:"/profile",icon:"User",component:x,meta:{nav:"个人中心",breadcrumb:L.userProfile},children:[{path:"",hidden:!0,component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-fffb1b64")]).then(n.bind(null,"4a39"))}}]},{path:"/settings",icon:"Setting",component:x,meta:{nav:"系统中心",requireAnyRoles:["SYS_OWNER"]},children:[{path:"sysEmail",icon:"Notification",component:function(){return Promise.all([n.e("chunk-48cebeac"),n.e("chunk-2d0cc811")]).then(n.bind(null,"4de0"))},meta:{nav:"邮箱设置",breadcrumb:L.sysEmailEdit}},{path:"sysKey",icon:"Key",hidden:"true",component:x,meta:{nav:"系统秘钥",breadcrumb:L.sysKeyEdit}}]}],R=Object(r["a"])({history:Object(r["b"])(),routes:D});R.beforeEach((function(e,t,n){0==e.meta.requireAuth?"/login"==e.path&&i["a"].hasAccessToken()?n(t):n():i["a"].hasAccessToken()?n():n({path:"/login"})})),R.beforeEach((function(e,t,n){!e.query.groupName&&t.query.groupName&&(e.query.groupName=t.query.groupName),!e.query.projectName&&t.query.projectName&&(e.query.projectName=t.query.projectName),n()}));t["a"]=R},b76b:function(e,t,n){"use strict";n("0135")},bc45:function(e,t,n){"use strict";n("c353")},c353:function(e,t,n){}});
+//# sourceMappingURL=app.51f76bee.js.map
\ No newline at end of file
diff --git a/api/src/main/resources/static/js/app.cf623e0d.js.map b/api/src/main/resources/static/js/app.51f76bee.js.map
similarity index 99%
rename from api/src/main/resources/static/js/app.cf623e0d.js.map
rename to api/src/main/resources/static/js/app.51f76bee.js.map
index 02d52b9..980645f 100644
--- a/api/src/main/resources/static/js/app.cf623e0d.js.map
+++ b/api/src/main/resources/static/js/app.51f76bee.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/store/index.js","webpack:///./src/App.vue","webpack:///./src/App.vue?8ecf","webpack:///./src/main.js","webpack:///./src/utils/auth.js","webpack:///./src/layouts/Layout.vue","webpack:///./src/components/AppNav.vue","webpack:///./src/components/AppNav.vue?33c4","webpack:///./src/components/Breadcrumb.vue","webpack:///./src/components/Breadcrumb.vue?57f7","webpack:///./src/components/Avatar.vue","webpack:///./src/components/Avatar.vue?a351","webpack:///./src/layouts/Layout.vue?726f","webpack:///./src/router/breadcurmb.js","webpack:///./src/router/index.js","webpack:///./src/layouts/Layout.vue?cd1b","webpack:///./src/components/AppNav.vue?747c"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","store","createStore","state","user","loadUserLoginData","userData","nickname","usernmae","email","mutations","userUpdate","param","__exports__","render","app","createApp","App","keys","Icons","forEach","component","directive","mounted","el","binding","roles","hasAnyRoles","updated","child","querySelector","id","poper","getElementById","selector","addEventListener","condition","this","scrollHeight","scrollTop","clientHeight","use","ElementPlus","router","mount","accessTokenKey","accessTokenExpireAtKey","userLoginDataKey","token","hasAccessToken","accessToken","loadAccessToken","hasValidAccessToken","expireAt","localStorage","getItem","Date","getTime","log","saveAccessToken","tokenExpireAt","setItem","saveUserLoginData","userLoginData","accessTokenExpireAt","JSON","stringify","removeUserLoginData","removeItem","parse","map","role","groupId","some","exists","expected","getRefreshToken","refreshToken","class","collapse","isCollapse","expandOrFold","index","title","routes","menu","isShowMenu","children","ele","hidden","path","icon","meta","nav","childIndex","setup","options","requireAnyRoles","separator","breadcrumbs","item","to","computed","$route","breadcrumb","$store","dropdown","userNickname","divided","toProfilePage","onLogout","size","avatarUrl","methods","$router","components","AppNav","Breadcrumb","Avatar","groupList","groupDashboard","route","groupName","query","params","groupProjectCreate","groupProjectEdit","projectName","projectId","groupProjectDocument","userList","userProfile","sysEmailEdit","breadcurmbMap","requireAuth","Layout","sysKeyEdit","createRouter","history","createWebHashHistory","beforeEach","from","next"],"mappings":"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","file":"js/app.cf623e0d.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-48cebeac\":\"b43a95b4\",\"chunk-1b2e2587\":\"2a26d5cb\",\"chunk-2d0cc811\":\"feb081c8\",\"chunk-3bf24d18\":\"e5da42ea\",\"chunk-7efe8be4\":\"e8bbd745\",\"chunk-9622a6d8\":\"c20b1f79\",\"chunk-abb10c56\":\"4c323350\",\"chunk-bf93911a\":\"d40185ff\",\"chunk-fffb1b64\":\"df1e960f\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-1b2e2587\":1,\"chunk-3bf24d18\":1,\"chunk-7efe8be4\":1,\"chunk-bf93911a\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-48cebeac\":\"31d6cfe0\",\"chunk-1b2e2587\":\"a5b9f9ad\",\"chunk-2d0cc811\":\"31d6cfe0\",\"chunk-3bf24d18\":\"e722c805\",\"chunk-7efe8be4\":\"a5cbc9e6\",\"chunk-9622a6d8\":\"31d6cfe0\",\"chunk-abb10c56\":\"31d6cfe0\",\"chunk-bf93911a\":\"ab54ac4c\",\"chunk-fffb1b64\":\"31d6cfe0\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { createStore } from 'vuex'\nimport { user } from '../utils/auth'\n\nconst store = createStore({\n    state() {\n        const data = user.loadUserLoginData()\n        const userData = {\n            nickname: null,\n            usernmae: null,\n            email: null,\n        }\n        if (data != null) {\n            userData.nickname = data.nickname\n            userData.usernmae = data.usernmae\n            userData.email = data.email;\n        }\n        return {\n            user: userData\n        }\n    },\n    mutations: {\n        userUpdate(state, param) {\n            if (param.nickname) {\n                state.user.nickname = param.nickname\n            }\n            if (param.usernmae) {\n                state.user.usernmae = param.usernmae\n            }\n            if (param.email) {\n                state.user.email = param.email\n            }\n        }\n    }\n})\n\nexport default store","<template>\n      <router-view/>\n</template>\n","import { render } from \"./App.vue?vue&type=template&id=2b08e877\"\nconst script = {}\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\nimport ElementPlus from 'element-plus'\nimport * as Icons from '@element-plus/icons'\nimport 'element-plus/dist/index.css'\nimport router from './router'\nimport store from './store'\nimport App from './App.vue'\nimport { user } from './utils/auth'\n\nconst app = createApp(App)\nObject.keys(Icons).forEach(key => {\n    app.component(key, Icons[key])\n})\napp.directive('require-roles', {\n    mounted(el, binding) {\n        const roles = binding.value\n        if (!user.hasAnyRoles(roles)) {\n            el.parentNode && el.parentNode.removeChild(el)\n        }\n    },\n})\n\napp.directive(\"select-more\", {\n    updated(el, binding) {\n        const child = el.querySelector('.select-trigger');\n        const id = child.getAttribute('aria-describedby');\n        const poper = document.getElementById(id);\n        const selector = poper.querySelector('.el-scrollbar .el-select-dropdown__wrap');\n        selector.addEventListener('scroll', function () {\n            const condition = this.scrollHeight - this.scrollTop - 1 <= this.clientHeight;\n            if (condition) {\n                binding.value();\n            }\n        });\n    },\n});\n\napp.use(store)\napp.use(ElementPlus)\napp.use(router)\napp.mount('#app')\n\n","const accessTokenKey = 'accessToken'\nconst accessTokenExpireAtKey = 'accessTokenExpireAt'\nconst userLoginDataKey = 'userLoginData'\n\nexport const token = {\n    hasAccessToken() {\n        const accessToken = this.loadAccessToken()\n        return accessToken\n    },\n\n    hasValidAccessToken() {\n        const accessToken = this.loadAccessToken()\n        const expireAt = window.localStorage.getItem(accessTokenExpireAtKey)\n        if (!accessToken || !expireAt) {\n            console.log('warn: not found accessToken and expireAt key')\n            return false\n        }\n        return expireAt > new Date().getTime()\n    },\n\n    saveAccessToken(token, tokenExpireAt) {\n        window.localStorage.setItem(accessTokenKey, token)\n        window.localStorage.setItem(accessTokenExpireAtKey, tokenExpireAt)\n    },\n\n    loadAccessToken() {\n        return window.localStorage.getItem(accessTokenKey)\n    }\n}\n\nexport const user = {\n\n    saveUserLoginData(userLoginData) {\n        window.localStorage.setItem(accessTokenKey, userLoginData.accessToken)\n        window.localStorage.setItem(accessTokenExpireAtKey, userLoginData.accessTokenExpireAt)\n        window.localStorage.setItem(userLoginDataKey, JSON.stringify(userLoginData))\n    },\n\n    removeUserLoginData() {\n        window.localStorage.removeItem(userLoginDataKey)\n        window.localStorage.removeItem(accessTokenKey)\n        window.localStorage.removeItem(accessTokenExpireAtKey)\n    },\n\n    loadUserLoginData() {\n        if (!window.localStorage.getItem(userLoginDataKey)) {\n            return null;\n        } else {\n            const data =window.localStorage.getItem(userLoginDataKey)\n            return JSON.parse(data)\n        }\n    },\n\n    hasAnyRoles(roles) {\n        const data = window.localStorage.getItem(userLoginDataKey)\n        if (data == null) {\n            return false\n        }\n        const user = JSON.parse(data)\n        return user\n        .roles\n        .map(role => {\n            if (role.groupId) {\n                return role.role + '?groupId=' + role.groupId\n            } else {\n                return role.role\n            }\n        })\n        .some(exists => roles.some(expected => expected == exists))\n    },\n\n    getRefreshToken() {\n        const data = window.localStorage.getItem(userLoginDataKey)\n        if (data == null) {\n            return null\n        }\n        const user = JSON.parse(data)\n        return user.refreshToken\n    }\n}\n","<template>\n    <el-container>\n        <el-aside class=\"databasir-nav\">\n            <AppNav></AppNav>\n        </el-aside>\n        <el-header class=\"databasir-main-header\">\n            <Breadcrumb></Breadcrumb>\n            <Avatar></Avatar>\n        </el-header>\n        <el-main class=\"databasir-main\">\n            <el-container>\n                <el-main class=\"databasir-main-content\">\n                    <router-view></router-view>\n                </el-main>\n            </el-container>\n        </el-main>\n    </el-container>\n</template>\n\n<style>\n.databasir-nav {\n    display: block;\n    position: fixed;\n    left: 0;\n    bottom: 0;\n    top: 0;\n    width: 200px;\n}\n\n.databasir-main-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    position: fixed;\n    top: 0px;\n    right: 0px;\n    left: 220px;\n    padding: 30px;\n    background: #FFF;\n    z-index: 100;\n    border-color: #EEE;\n    border-width: 0px 0px 1px 0px;\n    border-style: solid;\n}\n\n.databasir-main {\n    margin-left: 200px;\n    margin-top: 80px;\n    --el-main-padding: 0px 20px 20px 20px;\n}\n\n.databasir-main-content {\n    max-width: 95%;\n    --el-main-padding: 0px 20px 20px 20px;\n}\n\n</style>\n<script>\nimport AppNav from '../components/AppNav.vue'\nimport Breadcrumb from '../components/Breadcrumb.vue'\nimport Avatar from '../components/Avatar.vue'\nexport default {\n    components: { AppNav, Breadcrumb, Avatar },\n}\n\n</script>","<template>\n  <el-menu\n  router\n  :collapse=\"isCollapse\"\n  mode=\"vertical\"\n  class=\"left-menu\">\n    <el-menu-item v-if=\"isCollapse\" @click=\"expandOrFold\" index=\"#\">\n      <el-icon><expand /></el-icon>\n    </el-menu-item>\n    <el-menu-item index=\"/\">\n      <el-icon><home-filled /></el-icon>\n      <template #title>\n        <span>Databasir</span>\n      </template>\n    </el-menu-item>\n    <template v-for=\"(menu, index) in routes\" :key=\"index\" >\n      <el-sub-menu v-if=\"isShowMenu(menu) && menu.children.length > 0 && menu.children.some(ele => !ele.hidden)\" :index=\"menu.path\">\n        <template #title> \n          <el-icon>\n            <component :is=\"menu.icon\" />\n          </el-icon>\n          <span>{{ menu.meta.nav }}</span>\n        </template>\n        <template :key=\"index + '-' + childIndex\" v-for=\"(child, childIndex) in menu.children\">\n          <el-menu-item v-if=\"!child.hidden\"  :index=\"menu.path+'/'+child.path\">\n            <el-icon v-if=\"child.icon\">\n              <component :is=\"child.icon\" />\n            </el-icon>\n            <template #title>\n              <span>{{ child.meta.nav }}</span>\n            </template>\n          </el-menu-item>\n        </template>\n      </el-sub-menu>\n      <el-menu-item  v-else-if=\"isShowMenu(menu)\" :index=\"menu.path\">\n        <el-icon>\n          <component :is=\"menu.icon\" />\n        </el-icon>\n        <template #title>\n          <span>{{ menu.meta.nav }}</span>\n        </template> \n      </el-menu-item>\n    </template>\n  </el-menu>\n</template>\n<style>\n.left-menu:not(.el-menu--collapse) {\n  height: 100vh;\n}\n</style>\n<script>\nimport { useRouter } from 'vue-router'\nimport { ref } from 'vue'\nimport { user } from '../utils/auth'\nexport default {\n  setup() {\n    const isCollapse = ref(false)\n    const router = useRouter()\n    const routes = router.options.routes\n\n    const isShowMenu = (menu) => {\n      if (menu.hidden) {\n        return false\n      }\n      if (menu.meta.requireAnyRoles && menu.meta.requireAnyRoles.length > 0) {\n        const hasAnyRoles = user.hasAnyRoles(menu.meta.requireAnyRoles)\n        if (!hasAnyRoles) {\n          return false\n        }\n      }\n      return true\n    }\n\n    const expandOrFold = () => {\n      isCollapse.value = !isCollapse.value\n    }\n\n    return {\n      isCollapse,\n      isShowMenu,\n      expandOrFold,\n      routes,\n    }\n  }\n}\n</script>","import { render } from \"./AppNav.vue?vue&type=template&id=5e417f51\"\nimport script from \"./AppNav.vue?vue&type=script&lang=js\"\nexport * from \"./AppNav.vue?vue&type=script&lang=js\"\n\nimport \"./AppNav.vue?vue&type=style&index=0&id=5e417f51&lang=css\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <el-breadcrumb separator=\"/\" >\n        <el-breadcrumb-item  v-for=\"(item, index) in breadcrumbs\" :key=\"index\" :to=\"item.to\">{{ item.name }}</el-breadcrumb-item>\n  </el-breadcrumb>\n</template>\n\n<script>\n\nexport default{\n    computed: {\n        breadcrumbs: function() {\n            if (typeof this.$route.meta.breadcrumb === 'function') {\n                return this.$route.meta.breadcrumb(this.$route, this.$store.state)\n            } else {\n                return []\n            }\n        }\n    }\n}\n</script>","import { render } from \"./Breadcrumb.vue?vue&type=template&id=53855f6c\"\nimport script from \"./Breadcrumb.vue?vue&type=script&lang=js\"\nexport * from \"./Breadcrumb.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n    <el-dropdown>\n        <el-avatar :size=\"36\" :src=\"avatarUrl\" icon=\"avatar\"></el-avatar>\n        <template #dropdown>\n        <el-dropdown-menu>\n            <el-dropdown-item>{{ userNickname }}</el-dropdown-item>\n\n            <el-dropdown-item icon=\"user\" divided @click=\"toProfilePage()\">个人中心</el-dropdown-item>\n            <el-dropdown-item icon=\"back\" @click=\"onLogout()\">注销登陆</el-dropdown-item>\n        </el-dropdown-menu>\n        </template>\n    </el-dropdown>\n</template>\n\n<script>\nimport { user } from '../utils/auth'\n\nexport default {\n    data(){\n        return {\n            avatarUrl: null\n        }\n    },\n    computed: {\n        userNickname() {\n            return this.$store.state.user.nickname \n        }\n    },\n    methods: {\n        onLogout(){\n            user.removeUserLoginData()\n            this.$router.push({path: '/login'})\n        },\n        toProfilePage() {\n            this.$router.push({ path: '/profile'})\n        }\n    }\n}\n</script>\n","import { render } from \"./Avatar.vue?vue&type=template&id=41b59522\"\nimport script from \"./Avatar.vue?vue&type=script&lang=js\"\nexport * from \"./Avatar.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Layout.vue?vue&type=template&id=4207184d\"\nimport script from \"./Layout.vue?vue&type=script&lang=js\"\nexport * from \"./Layout.vue?vue&type=script&lang=js\"\n\nimport \"./Layout.vue?vue&type=style&index=0&id=4207184d&lang=css\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","function index() {\n    return {\n        name:'首页',\n        to: {\n            path: '/'\n        }\n    }\n}\n\nfunction groupList() {\n    return {\n        name:'分组列表',\n        to: {\n            name: 'groupListPage'\n        } \n    }\n}\n\nfunction groupDashboard(route) {\n    var groupName = '分組详情'\n    if (route.query.groupName) {\n        groupName = route.query.groupName\n    }\n    return {\n        name: groupName,\n        to: {\n            path: '/groups/'+route.params.groupId\n        } \n    }\n}\n\nfunction groupProjectCreate() {\n    return {\n        name:'项目创建',\n        to: {\n            path: '/projects/create'\n        } \n    }\n}\n\nfunction groupProjectEdit(route) {\n    var name = '项目编辑'\n    if (route.query.projectName) {\n        name = route.query.projectName\n    }\n    return {\n        name: name,\n        to: {\n            path: '/projects/'+route.params.projectId+'/edit'\n        } \n    }\n}\n\nfunction groupProjectDocument(route) {\n    var name = '项目文档'\n    if (route.query.projectName) {\n        name = route.query.projectName\n    }\n    return {\n        name: name,\n        to: {\n            path: '/groups/'+route.params.groupId+'/projects'\n        } \n    }\n}\n\nfunction userList() {\n    return {\n        name:'用户列表',\n        to: {\n            path: '/users'\n        } \n    }\n}\n\n\nfunction userProfile() {\n    return {\n        name:'个人中心',\n        to: {\n            path: '/profile'\n        } \n    }\n}\n\nfunction sysEmailEdit() {\n    return {\n        name:'邮箱设置',\n        to: {\n            path: '/settings/sysEmail'\n        } \n    }\n}\n\nconst breadcurmbMap = {\n    index: () => [index() ],\n    groupList: () => [index(), groupList()],\n    groupDashboard: (route, state) => [index(), groupList(), groupDashboard(route, state)],\n    groupProjectCreate:(route, state) =>  [index(), groupList(), groupDashboard(route, state), groupProjectCreate(route)],\n    groupProjectEdit: (route, state) => [index(), groupList(), groupDashboard(route, state), groupProjectEdit(route)],\n    groupProjectDocument: (route, state) => [index(), groupList(), groupDashboard(route, state),  groupProjectDocument(route)],\n    userProfile: () =>  [index(), userProfile()],\n    userList: () =>  [index(), userList()],\n    sysEmailEdit: () => [index(), sysEmailEdit()]\n}\n\nexport default breadcurmbMap","import { createRouter, createWebHashHistory } from 'vue-router';\nimport Layout from \"../layouts/Layout.vue\"\nimport breadcurmbMap from './breadcurmb'\nimport { token } from '../utils/auth';\n\nconst routes = [\n    {\n        path: '/login',\n        component: () => import('@/views/Login.vue'),\n        hidden: true,\n        meta: {\n            requireAuth: false\n        }\n    },\n    {\n        path: '/',\n        hidden: true,\n        component: Layout,\n        children: [\n            {\n                path: '',\n                hidden: true,\n                component: () => import('@/views/GroupList.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupList\n                }\n            }\n        ]\n    },\n    {\n        path: '/groups',\n        icon: 'Collection',\n        component: Layout,\n        meta: {\n            nav: '分组列表',\n        },\n        children: [\n            {\n                path: '',\n                name: 'groupListPage',\n                hidden: true,\n                component: () => import('@/views/GroupList.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupList\n                }\n            },\n            {\n                path: ':groupId',\n                hidden: true,\n                component: () => import('@/views/GroupDashboard.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupDashboard\n                }\n            },\n            {\n                path: ':groupId/projects/:projectId/edit',\n                hidden: true,\n                component: () => import('@/views/ProjectEdit.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupProjectEdit\n                }\n            },\n            {\n                path: ':groupId/projects/create',\n                hidden: true,\n                component: () => import('@/views/ProjectEdit.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupProjectCreate\n                }\n            },\n            {\n                path: ':groupId/projects/:projectId/documents',\n                hidden: true,\n                component: () => import('@/views/Document.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupProjectDocument\n                }\n            }\n        ]\n    },\n    {\n        path: '/users',\n        icon: 'List',\n        component: Layout,\n        meta: {\n            nav:'用户中心',\n            requireAnyRoles: ['SYS_OWNER']\n        },\n        children: [\n            {\n                path: '',\n                hidden: true,\n                component: () => import('@/views/UserList.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.userList\n                }\n            }\n        ]\n    },\n    {\n        path: '/profile',\n        icon: 'User',\n        component: Layout,\n        meta: {\n            nav: '个人中心',\n            breadcrumb: breadcurmbMap.userProfile\n        },\n        children: [\n            {\n                path: '',\n                hidden: true,\n                component: () => import('@/views/UserProfile.vue')\n            }\n        ]\n    },\n    {\n        path: '/settings',\n        icon: 'Setting',\n        component: Layout,\n        meta: {\n            nav:'系统中心',\n            requireAnyRoles: ['SYS_OWNER']\n        },\n        children: [\n            {\n                path: 'sysEmail',\n                icon: 'Notification',\n                component: () => import('@/views/SysEmailEdit.vue'),\n                meta: {\n                    nav: '邮箱设置',\n                    breadcrumb: breadcurmbMap.sysEmailEdit\n                }\n            },\n            // TODO\n            {\n                path: 'sysKey',\n                icon: 'Key',\n                hidden: 'true',\n                component: Layout,\n                meta: {\n                    nav: '系统秘钥',\n                    breadcrumb: breadcurmbMap.sysKeyEdit\n                }\n            }\n        ]\n    }\n];\n\nconst router = createRouter({\n    history: createWebHashHistory(),\n    routes\n});\n\n// 权限路由守卫\nrouter.beforeEach((to, from, next) => {\n    if (to.meta.requireAuth == false) {\n        if (to.path == '/login' && token.hasAccessToken()) {\n            next(from)\n        } else {\n            next()\n        }\n    } else {\n        if(token.hasAccessToken()) {\n            next()\n        } else {\n            next({ path: '/login' })\n        }\n    }\n})\n\n// groupName 参数路由守卫\nrouter.beforeEach((to, from, next) => {\n    if (!to.query.groupName && from.query.groupName) {\n        to.query.groupName = from.query.groupName\n    } \n    if (!to.query.projectName && from.query.projectName) {\n        to.query.projectName = from.query.projectName\n    } \n    next();\n})\n\nexport default router;","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./Layout.vue?vue&type=style&index=0&id=4207184d&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./AppNav.vue?vue&type=style&index=0&id=5e417f51&lang=css\""],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/store/index.js","webpack:///./src/App.vue","webpack:///./src/App.vue?8ecf","webpack:///./src/main.js","webpack:///./src/utils/auth.js","webpack:///./src/layouts/Layout.vue","webpack:///./src/components/AppNav.vue","webpack:///./src/components/AppNav.vue?33c4","webpack:///./src/components/Breadcrumb.vue","webpack:///./src/components/Breadcrumb.vue?57f7","webpack:///./src/components/Avatar.vue","webpack:///./src/components/Avatar.vue?a351","webpack:///./src/layouts/Layout.vue?726f","webpack:///./src/router/breadcurmb.js","webpack:///./src/router/index.js","webpack:///./src/layouts/Layout.vue?cd1b","webpack:///./src/components/AppNav.vue?747c"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","store","createStore","state","user","loadUserLoginData","userData","nickname","usernmae","email","mutations","userUpdate","param","__exports__","render","app","createApp","App","keys","Icons","forEach","component","directive","mounted","el","binding","roles","hasAnyRoles","updated","child","querySelector","id","poper","getElementById","selector","addEventListener","condition","this","scrollHeight","scrollTop","clientHeight","use","ElementPlus","router","mount","accessTokenKey","accessTokenExpireAtKey","userLoginDataKey","token","hasAccessToken","accessToken","loadAccessToken","hasValidAccessToken","expireAt","localStorage","getItem","Date","getTime","log","saveAccessToken","tokenExpireAt","setItem","saveUserLoginData","userLoginData","accessTokenExpireAt","JSON","stringify","removeUserLoginData","removeItem","parse","map","role","groupId","some","exists","expected","getRefreshToken","refreshToken","class","collapse","isCollapse","expandOrFold","index","title","routes","menu","isShowMenu","children","ele","hidden","path","icon","meta","nav","childIndex","setup","options","requireAnyRoles","separator","breadcrumbs","item","to","computed","$route","breadcrumb","$store","dropdown","userNickname","divided","toProfilePage","onLogout","size","avatarUrl","methods","$router","components","AppNav","Breadcrumb","Avatar","groupList","groupDashboard","route","groupName","query","params","groupProjectCreate","groupProjectEdit","projectName","projectId","groupProjectDocument","userList","userProfile","sysEmailEdit","breadcurmbMap","requireAuth","Layout","sysKeyEdit","createRouter","history","createWebHashHistory","beforeEach","from","next"],"mappings":"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","file":"js/app.51f76bee.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-48cebeac\":\"b43a95b4\",\"chunk-1b2e2587\":\"2a26d5cb\",\"chunk-2d0cc811\":\"feb081c8\",\"chunk-4935816e\":\"627c0115\",\"chunk-7efe8be4\":\"e8bbd745\",\"chunk-9622a6d8\":\"c20b1f79\",\"chunk-abb10c56\":\"4c323350\",\"chunk-bf93911a\":\"d40185ff\",\"chunk-fffb1b64\":\"df1e960f\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-1b2e2587\":1,\"chunk-4935816e\":1,\"chunk-7efe8be4\":1,\"chunk-bf93911a\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-48cebeac\":\"31d6cfe0\",\"chunk-1b2e2587\":\"a5b9f9ad\",\"chunk-2d0cc811\":\"31d6cfe0\",\"chunk-4935816e\":\"e722c805\",\"chunk-7efe8be4\":\"a5cbc9e6\",\"chunk-9622a6d8\":\"31d6cfe0\",\"chunk-abb10c56\":\"31d6cfe0\",\"chunk-bf93911a\":\"ab54ac4c\",\"chunk-fffb1b64\":\"31d6cfe0\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { createStore } from 'vuex'\nimport { user } from '../utils/auth'\n\nconst store = createStore({\n    state() {\n        const data = user.loadUserLoginData()\n        const userData = {\n            nickname: null,\n            usernmae: null,\n            email: null,\n        }\n        if (data != null) {\n            userData.nickname = data.nickname\n            userData.usernmae = data.usernmae\n            userData.email = data.email;\n        }\n        return {\n            user: userData\n        }\n    },\n    mutations: {\n        userUpdate(state, param) {\n            if (param.nickname) {\n                state.user.nickname = param.nickname\n            }\n            if (param.usernmae) {\n                state.user.usernmae = param.usernmae\n            }\n            if (param.email) {\n                state.user.email = param.email\n            }\n        }\n    }\n})\n\nexport default store","<template>\n      <router-view/>\n</template>\n","import { render } from \"./App.vue?vue&type=template&id=2b08e877\"\nconst script = {}\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createApp } from 'vue'\nimport ElementPlus from 'element-plus'\nimport * as Icons from '@element-plus/icons'\nimport 'element-plus/dist/index.css'\nimport router from './router'\nimport store from './store'\nimport App from './App.vue'\nimport { user } from './utils/auth'\n\nconst app = createApp(App)\nObject.keys(Icons).forEach(key => {\n    app.component(key, Icons[key])\n})\napp.directive('require-roles', {\n    mounted(el, binding) {\n        const roles = binding.value\n        if (!user.hasAnyRoles(roles)) {\n            el.parentNode && el.parentNode.removeChild(el)\n        }\n    },\n})\n\napp.directive(\"select-more\", {\n    updated(el, binding) {\n        const child = el.querySelector('.select-trigger');\n        const id = child.getAttribute('aria-describedby');\n        const poper = document.getElementById(id);\n        const selector = poper.querySelector('.el-scrollbar .el-select-dropdown__wrap');\n        selector.addEventListener('scroll', function () {\n            const condition = this.scrollHeight - this.scrollTop - 1 <= this.clientHeight;\n            if (condition) {\n                binding.value();\n            }\n        });\n    },\n});\n\napp.use(store)\napp.use(ElementPlus)\napp.use(router)\napp.mount('#app')\n\n","const accessTokenKey = 'accessToken'\nconst accessTokenExpireAtKey = 'accessTokenExpireAt'\nconst userLoginDataKey = 'userLoginData'\n\nexport const token = {\n    hasAccessToken() {\n        const accessToken = this.loadAccessToken()\n        return accessToken\n    },\n\n    hasValidAccessToken() {\n        const accessToken = this.loadAccessToken()\n        const expireAt = window.localStorage.getItem(accessTokenExpireAtKey)\n        if (!accessToken || !expireAt) {\n            console.log('warn: not found accessToken and expireAt key')\n            return false\n        }\n        return expireAt > new Date().getTime()\n    },\n\n    saveAccessToken(token, tokenExpireAt) {\n        window.localStorage.setItem(accessTokenKey, token)\n        window.localStorage.setItem(accessTokenExpireAtKey, tokenExpireAt)\n    },\n\n    loadAccessToken() {\n        return window.localStorage.getItem(accessTokenKey)\n    }\n}\n\nexport const user = {\n\n    saveUserLoginData(userLoginData) {\n        window.localStorage.setItem(accessTokenKey, userLoginData.accessToken)\n        window.localStorage.setItem(accessTokenExpireAtKey, userLoginData.accessTokenExpireAt)\n        window.localStorage.setItem(userLoginDataKey, JSON.stringify(userLoginData))\n    },\n\n    removeUserLoginData() {\n        window.localStorage.removeItem(userLoginDataKey)\n        window.localStorage.removeItem(accessTokenKey)\n        window.localStorage.removeItem(accessTokenExpireAtKey)\n    },\n\n    loadUserLoginData() {\n        if (!window.localStorage.getItem(userLoginDataKey)) {\n            return null;\n        } else {\n            const data =window.localStorage.getItem(userLoginDataKey)\n            return JSON.parse(data)\n        }\n    },\n\n    hasAnyRoles(roles) {\n        const data = window.localStorage.getItem(userLoginDataKey)\n        if (data == null) {\n            return false\n        }\n        const user = JSON.parse(data)\n        return user\n        .roles\n        .map(role => {\n            if (role.groupId) {\n                return role.role + '?groupId=' + role.groupId\n            } else {\n                return role.role\n            }\n        })\n        .some(exists => roles.some(expected => expected == exists))\n    },\n\n    getRefreshToken() {\n        const data = window.localStorage.getItem(userLoginDataKey)\n        if (data == null) {\n            return null\n        }\n        const user = JSON.parse(data)\n        return user.refreshToken\n    }\n}\n","<template>\n    <el-container>\n        <el-aside class=\"databasir-nav\">\n            <AppNav></AppNav>\n        </el-aside>\n        <el-header class=\"databasir-main-header\">\n            <Breadcrumb></Breadcrumb>\n            <Avatar></Avatar>\n        </el-header>\n        <el-main class=\"databasir-main\">\n            <el-container>\n                <el-main class=\"databasir-main-content\">\n                    <router-view></router-view>\n                </el-main>\n            </el-container>\n        </el-main>\n    </el-container>\n</template>\n\n<style>\n.databasir-nav {\n    display: block;\n    position: fixed;\n    left: 0;\n    bottom: 0;\n    top: 0;\n    width: 200px;\n}\n\n.databasir-main-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    position: fixed;\n    top: 0px;\n    right: 0px;\n    left: 220px;\n    padding: 30px;\n    background: #FFF;\n    z-index: 100;\n    border-color: #EEE;\n    border-width: 0px 0px 1px 0px;\n    border-style: solid;\n}\n\n.databasir-main {\n    margin-left: 200px;\n    margin-top: 80px;\n    --el-main-padding: 0px 20px 20px 20px;\n}\n\n.databasir-main-content {\n    max-width: 95%;\n    --el-main-padding: 0px 20px 20px 20px;\n}\n\n</style>\n<script>\nimport AppNav from '../components/AppNav.vue'\nimport Breadcrumb from '../components/Breadcrumb.vue'\nimport Avatar from '../components/Avatar.vue'\nexport default {\n    components: { AppNav, Breadcrumb, Avatar },\n}\n\n</script>","<template>\n  <el-menu\n  router\n  :collapse=\"isCollapse\"\n  mode=\"vertical\"\n  class=\"left-menu\">\n    <el-menu-item v-if=\"isCollapse\" @click=\"expandOrFold\" index=\"#\">\n      <el-icon><expand /></el-icon>\n    </el-menu-item>\n    <el-menu-item index=\"/\">\n      <el-icon><home-filled /></el-icon>\n      <template #title>\n        <span>Databasir</span>\n      </template>\n    </el-menu-item>\n    <template v-for=\"(menu, index) in routes\" :key=\"index\" >\n      <el-sub-menu v-if=\"isShowMenu(menu) && menu.children.length > 0 && menu.children.some(ele => !ele.hidden)\" :index=\"menu.path\">\n        <template #title> \n          <el-icon>\n            <component :is=\"menu.icon\" />\n          </el-icon>\n          <span>{{ menu.meta.nav }}</span>\n        </template>\n        <template :key=\"index + '-' + childIndex\" v-for=\"(child, childIndex) in menu.children\">\n          <el-menu-item v-if=\"!child.hidden\"  :index=\"menu.path+'/'+child.path\">\n            <el-icon v-if=\"child.icon\">\n              <component :is=\"child.icon\" />\n            </el-icon>\n            <template #title>\n              <span>{{ child.meta.nav }}</span>\n            </template>\n          </el-menu-item>\n        </template>\n      </el-sub-menu>\n      <el-menu-item  v-else-if=\"isShowMenu(menu)\" :index=\"menu.path\">\n        <el-icon>\n          <component :is=\"menu.icon\" />\n        </el-icon>\n        <template #title>\n          <span>{{ menu.meta.nav }}</span>\n        </template> \n      </el-menu-item>\n    </template>\n  </el-menu>\n</template>\n<style>\n.left-menu:not(.el-menu--collapse) {\n  height: 100vh;\n}\n</style>\n<script>\nimport { useRouter } from 'vue-router'\nimport { ref } from 'vue'\nimport { user } from '../utils/auth'\nexport default {\n  setup() {\n    const isCollapse = ref(false)\n    const router = useRouter()\n    const routes = router.options.routes\n\n    const isShowMenu = (menu) => {\n      if (menu.hidden) {\n        return false\n      }\n      if (menu.meta.requireAnyRoles && menu.meta.requireAnyRoles.length > 0) {\n        const hasAnyRoles = user.hasAnyRoles(menu.meta.requireAnyRoles)\n        if (!hasAnyRoles) {\n          return false\n        }\n      }\n      return true\n    }\n\n    const expandOrFold = () => {\n      isCollapse.value = !isCollapse.value\n    }\n\n    return {\n      isCollapse,\n      isShowMenu,\n      expandOrFold,\n      routes,\n    }\n  }\n}\n</script>","import { render } from \"./AppNav.vue?vue&type=template&id=5e417f51\"\nimport script from \"./AppNav.vue?vue&type=script&lang=js\"\nexport * from \"./AppNav.vue?vue&type=script&lang=js\"\n\nimport \"./AppNav.vue?vue&type=style&index=0&id=5e417f51&lang=css\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n  <el-breadcrumb separator=\"/\" >\n        <el-breadcrumb-item  v-for=\"(item, index) in breadcrumbs\" :key=\"index\" :to=\"item.to\">{{ item.name }}</el-breadcrumb-item>\n  </el-breadcrumb>\n</template>\n\n<script>\n\nexport default{\n    computed: {\n        breadcrumbs: function() {\n            if (typeof this.$route.meta.breadcrumb === 'function') {\n                return this.$route.meta.breadcrumb(this.$route, this.$store.state)\n            } else {\n                return []\n            }\n        }\n    }\n}\n</script>","import { render } from \"./Breadcrumb.vue?vue&type=template&id=53855f6c\"\nimport script from \"./Breadcrumb.vue?vue&type=script&lang=js\"\nexport * from \"./Breadcrumb.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n    <el-dropdown>\n        <el-avatar :size=\"36\" :src=\"avatarUrl\" icon=\"avatar\"></el-avatar>\n        <template #dropdown>\n        <el-dropdown-menu>\n            <el-dropdown-item>{{ userNickname }}</el-dropdown-item>\n\n            <el-dropdown-item icon=\"user\" divided @click=\"toProfilePage()\">个人中心</el-dropdown-item>\n            <el-dropdown-item icon=\"back\" @click=\"onLogout()\">注销登陆</el-dropdown-item>\n        </el-dropdown-menu>\n        </template>\n    </el-dropdown>\n</template>\n\n<script>\nimport { user } from '../utils/auth'\n\nexport default {\n    data(){\n        return {\n            avatarUrl: null\n        }\n    },\n    computed: {\n        userNickname() {\n            return this.$store.state.user.nickname \n        }\n    },\n    methods: {\n        onLogout(){\n            user.removeUserLoginData()\n            this.$router.push({path: '/login'})\n        },\n        toProfilePage() {\n            this.$router.push({ path: '/profile'})\n        }\n    }\n}\n</script>\n","import { render } from \"./Avatar.vue?vue&type=template&id=41b59522\"\nimport script from \"./Avatar.vue?vue&type=script&lang=js\"\nexport * from \"./Avatar.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Layout.vue?vue&type=template&id=4207184d\"\nimport script from \"./Layout.vue?vue&type=script&lang=js\"\nexport * from \"./Layout.vue?vue&type=script&lang=js\"\n\nimport \"./Layout.vue?vue&type=style&index=0&id=4207184d&lang=css\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","function index() {\n    return {\n        name:'首页',\n        to: {\n            path: '/'\n        }\n    }\n}\n\nfunction groupList() {\n    return {\n        name:'分组列表',\n        to: {\n            name: 'groupListPage'\n        } \n    }\n}\n\nfunction groupDashboard(route) {\n    var groupName = '分組详情'\n    if (route.query.groupName) {\n        groupName = route.query.groupName\n    }\n    return {\n        name: groupName,\n        to: {\n            path: '/groups/'+route.params.groupId\n        } \n    }\n}\n\nfunction groupProjectCreate() {\n    return {\n        name:'项目创建',\n        to: {\n            path: '/projects/create'\n        } \n    }\n}\n\nfunction groupProjectEdit(route) {\n    var name = '项目编辑'\n    if (route.query.projectName) {\n        name = route.query.projectName\n    }\n    return {\n        name: name,\n        to: {\n            path: '/projects/'+route.params.projectId+'/edit'\n        } \n    }\n}\n\nfunction groupProjectDocument(route) {\n    var name = '项目文档'\n    if (route.query.projectName) {\n        name = route.query.projectName\n    }\n    return {\n        name: name,\n        to: {\n            path: '/groups/'+route.params.groupId+'/projects'\n        } \n    }\n}\n\nfunction userList() {\n    return {\n        name:'用户列表',\n        to: {\n            path: '/users'\n        } \n    }\n}\n\n\nfunction userProfile() {\n    return {\n        name:'个人中心',\n        to: {\n            path: '/profile'\n        } \n    }\n}\n\nfunction sysEmailEdit() {\n    return {\n        name:'邮箱设置',\n        to: {\n            path: '/settings/sysEmail'\n        } \n    }\n}\n\nconst breadcurmbMap = {\n    index: () => [index() ],\n    groupList: () => [index(), groupList()],\n    groupDashboard: (route, state) => [index(), groupList(), groupDashboard(route, state)],\n    groupProjectCreate:(route, state) =>  [index(), groupList(), groupDashboard(route, state), groupProjectCreate(route)],\n    groupProjectEdit: (route, state) => [index(), groupList(), groupDashboard(route, state), groupProjectEdit(route)],\n    groupProjectDocument: (route, state) => [index(), groupList(), groupDashboard(route, state),  groupProjectDocument(route)],\n    userProfile: () =>  [index(), userProfile()],\n    userList: () =>  [index(), userList()],\n    sysEmailEdit: () => [index(), sysEmailEdit()]\n}\n\nexport default breadcurmbMap","import { createRouter, createWebHashHistory } from 'vue-router';\nimport Layout from \"../layouts/Layout.vue\"\nimport breadcurmbMap from './breadcurmb'\nimport { token } from '../utils/auth';\n\nconst routes = [\n    {\n        path: '/login',\n        component: () => import('@/views/Login.vue'),\n        hidden: true,\n        meta: {\n            requireAuth: false\n        }\n    },\n    {\n        path: '/',\n        hidden: true,\n        component: Layout,\n        children: [\n            {\n                path: '',\n                hidden: true,\n                component: () => import('@/views/GroupList.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupList\n                }\n            }\n        ]\n    },\n    {\n        path: '/groups',\n        icon: 'Collection',\n        component: Layout,\n        meta: {\n            nav: '分组列表',\n        },\n        children: [\n            {\n                path: '',\n                name: 'groupListPage',\n                hidden: true,\n                component: () => import('@/views/GroupList.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupList\n                }\n            },\n            {\n                path: ':groupId',\n                hidden: true,\n                component: () => import('@/views/GroupDashboard.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupDashboard\n                }\n            },\n            {\n                path: ':groupId/projects/:projectId/edit',\n                hidden: true,\n                component: () => import('@/views/ProjectEdit.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupProjectEdit\n                }\n            },\n            {\n                path: ':groupId/projects/create',\n                hidden: true,\n                component: () => import('@/views/ProjectEdit.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupProjectCreate\n                }\n            },\n            {\n                path: ':groupId/projects/:projectId/documents',\n                hidden: true,\n                component: () => import('@/views/Document.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.groupProjectDocument\n                }\n            }\n        ]\n    },\n    {\n        path: '/users',\n        icon: 'List',\n        component: Layout,\n        meta: {\n            nav:'用户中心',\n            requireAnyRoles: ['SYS_OWNER']\n        },\n        children: [\n            {\n                path: '',\n                hidden: true,\n                component: () => import('@/views/UserList.vue'),\n                meta: {\n                    breadcrumb: breadcurmbMap.userList\n                }\n            }\n        ]\n    },\n    {\n        path: '/profile',\n        icon: 'User',\n        component: Layout,\n        meta: {\n            nav: '个人中心',\n            breadcrumb: breadcurmbMap.userProfile\n        },\n        children: [\n            {\n                path: '',\n                hidden: true,\n                component: () => import('@/views/UserProfile.vue')\n            }\n        ]\n    },\n    {\n        path: '/settings',\n        icon: 'Setting',\n        component: Layout,\n        meta: {\n            nav:'系统中心',\n            requireAnyRoles: ['SYS_OWNER']\n        },\n        children: [\n            {\n                path: 'sysEmail',\n                icon: 'Notification',\n                component: () => import('@/views/SysEmailEdit.vue'),\n                meta: {\n                    nav: '邮箱设置',\n                    breadcrumb: breadcurmbMap.sysEmailEdit\n                }\n            },\n            // TODO\n            {\n                path: 'sysKey',\n                icon: 'Key',\n                hidden: 'true',\n                component: Layout,\n                meta: {\n                    nav: '系统秘钥',\n                    breadcrumb: breadcurmbMap.sysKeyEdit\n                }\n            }\n        ]\n    }\n];\n\nconst router = createRouter({\n    history: createWebHashHistory(),\n    routes\n});\n\n// 权限路由守卫\nrouter.beforeEach((to, from, next) => {\n    if (to.meta.requireAuth == false) {\n        if (to.path == '/login' && token.hasAccessToken()) {\n            next(from)\n        } else {\n            next()\n        }\n    } else {\n        if(token.hasAccessToken()) {\n            next()\n        } else {\n            next({ path: '/login' })\n        }\n    }\n})\n\n// groupName 参数路由守卫\nrouter.beforeEach((to, from, next) => {\n    if (!to.query.groupName && from.query.groupName) {\n        to.query.groupName = from.query.groupName\n    } \n    if (!to.query.projectName && from.query.projectName) {\n        to.query.projectName = from.query.projectName\n    } \n    next();\n})\n\nexport default router;","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./Layout.vue?vue&type=style&index=0&id=4207184d&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./AppNav.vue?vue&type=style&index=0&id=5e417f51&lang=css\""],"sourceRoot":""}
\ No newline at end of file
diff --git a/api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js b/api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js
deleted file mode 100644
index 4b81240..0000000
--- a/api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-3bf24d18"],{"0742":function(e,t,a){"use strict";a.r(t);a("b0c0");var n=a("7a23"),r={key:0},c=Object(n["createTextVNode"])("同步"),o={key:1},l={key:2},i=Object(n["createTextVNode"])("同步"),u=Object(n["createTextVNode"])("导出"),d={class:"document-content"},b=["id"],s=["id"],m=Object(n["createElementVNode"])("h3",null,"Columns",-1),j={key:0},O=Object(n["createElementVNode"])("h3",null,"Indexes",-1),p={key:1},f=Object(n["createElementVNode"])("h3",null,"Triggers",-1),g={class:"toc-wrapper"},h={class:"toc"},V={class:"remark-header"},N={class:"remark-user"},w={class:"remark-time"},C={class:"item text remark-content"},k=Object(n["createTextVNode"])("提交");function D(e,t,a,D,x,v){var _=Object(n["resolveComponent"])("el-button"),y=Object(n["resolveComponent"])("el-empty"),E=Object(n["resolveComponent"])("el-skeleton"),B=Object(n["resolveComponent"])("el-col"),I=Object(n["resolveComponent"])("el-option"),R=Object(n["resolveComponent"])("el-select"),S=Object(n["resolveComponent"])("el-row"),P=Object(n["resolveComponent"])("el-header"),T=Object(n["resolveComponent"])("el-descriptions-item"),F=Object(n["resolveComponent"])("el-descriptions"),z=Object(n["resolveComponent"])("el-table-column"),U=Object(n["resolveComponent"])("el-table"),M=Object(n["resolveComponent"])("el-link"),G=Object(n["resolveComponent"])("el-backtop"),W=Object(n["resolveComponent"])("el-tooltip"),A=Object(n["resolveComponent"])("el-popconfirm"),L=Object(n["resolveComponent"])("el-card"),Y=Object(n["resolveComponent"])("el-pagination"),q=Object(n["resolveComponent"])("el-divider"),J=Object(n["resolveComponent"])("el-input"),H=Object(n["resolveComponent"])("el-drawer"),K=Object(n["resolveComponent"])("el-main"),Q=Object(n["resolveComponent"])("el-container"),X=Object(n["resolveDirective"])("loading"),Z=Object(n["resolveDirective"])("require-roles"),$=Object(n["resolveDirective"])("select-more");return D.isShowNoDataPage?(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",r,[Object(n["createVNode"])(y,{description:"似乎还没有同步过文档"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{type:"primary",icon:"refresh",round:"",size:"large",onClick:D.onSyncProjectDocument,loading:D.state.loadings.handleSync},{default:Object(n["withCtx"])((function(){return[c]})),_:1},8,["onClick","loading"])]})),_:1})])):D.isShowLoadingPage?(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",o,[Object(n["withDirectives"])(Object(n["createVNode"])(E,{rows:12},null,512),[[X,!D.state.init]])])):(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",l,[Object(n["createVNode"])(Q,{class:"document-container"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(P,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(S,{gutter:20},{default:Object(n["withCtx"])((function(){return[Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(B,{span:2},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{type:"success",style:{width:"100%"},icon:"Refresh",onClick:D.onSyncProjectDocument,loading:D.state.loadings.handleSync},{default:Object(n["withCtx"])((function(){return[i]})),_:1},8,["onClick","loading"])]})),_:1})),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]]),Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(B,{span:2},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{type:"primary",style:{width:"100%"},icon:"Download"},{default:Object(n["withCtx"])((function(){return[u]})),_:1})]})),_:1})),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]]),Object(n["createVNode"])(B,{span:4},{default:Object(n["withCtx"])((function(){return[Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(R,{onChange:D.onProjectDocumentVersionChange,modelValue:D.state.databaseDocumentFilter.version,"onUpdate:modelValue":t[0]||(t[0]=function(e){return D.state.databaseDocumentFilter.version=e}),placeholder:"历史版本",clearable:""},{default:Object(n["withCtx"])((function(){return[(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(D.state.databaseDocumentVersions,(function(e){return Object(n["openBlock"])(),Object(n["createBlock"])(I,{key:e.version,label:"["+e.createAt+"]->"+e.version,value:e.version},null,8,["label","value"])})),128))]})),_:1},8,["onChange","modelValue"])),[[$,D.loadMoreDocumentVersions],[X,D.state.loadings.loadingVersions]])]})),_:1})]})),_:1})]})),_:1}),Object(n["createVNode"])(K,{class:"document-content-wrapper"},{default:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("div",d,[Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(F,{column:1,size:"large",border:""},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(T,{label:"Database Name","label-align":"left",width:"200px"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.databaseName),1)]})),_:1}),Object(n["createVNode"])(T,{label:"Product Name","label-align":"left"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.productName),1)]})),_:1}),Object(n["createVNode"])(T,{label:"Product Version","label-align":"left"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.productVersion),1)]})),_:1}),Object(n["createVNode"])(T,{label:"Document Version","label-align":"left"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.documentVersion),1)]})),_:1}),Object(n["createVNode"])(T,{label:"Create At","label-align":"left"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.createAt),1)]})),_:1})]})),_:1})]})),_:1})]})),_:1}),Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("h2",{id:D.state.databaseDocument.databaseName+".overview"},"Overview",8,b)]})),_:1})]})),_:1}),Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(U,{data:D.state.databaseDocument.tables,border:"",width:"80%"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(z,{type:"index"}),Object(n["createVNode"])(z,{prop:"name",label:"Name","min-width":"160",resizable:""}),Object(n["createVNode"])(z,{prop:"type",label:"Type",width:"200",resizable:""}),Object(n["createVNode"])(z,{prop:"comment",label:"comment","min-width":"160",resizable:""}),Object(n["createVNode"])(z,{prop:"remark",label:"remark","min-width":"160",resizable:""},{default:Object(n["withCtx"])((function(e){return[Object(n["createVNode"])(_,{onClick:function(t){return D.showRemarkDrawer(e.row.name)},size:"small",icon:D.Edit},null,8,["onClick","icon"])]})),_:1})]})),_:1},8,["data"])]})),_:1})]})),_:1}),(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(D.state.databaseDocument.tables,(function(e){return Object(n["openBlock"])(),Object(n["createElementBlock"])(n["Fragment"],{key:e},[Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("h2",{id:D.state.databaseDocument.databaseName+"."+e.name},Object(n["toDisplayString"])(e.name),9,s)]})),_:2},1024)]})),_:2},1024),Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[e.columns.length>0?(Object(n["openBlock"])(),Object(n["createBlock"])(B,{key:0},{default:Object(n["withCtx"])((function(){return[m]})),_:1})):Object(n["createCommentVNode"])("",!0)]})),_:2},1024),Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(U,{data:e.columns,border:"",fit:"",width:"80%"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(z,{type:"index"}),Object(n["createVNode"])(z,{prop:"name",label:"Name","min-width":"120"}),Object(n["createVNode"])(z,{prop:"type",formatter:D.columnTypeFormat,label:"Type",width:"140"},null,8,["formatter"]),Object(n["createVNode"])(z,{prop:"nullable",label:"Is Nullable",width:"120"}),Object(n["createVNode"])(z,{prop:"autoIncrement",label:"Auto increment",width:"140"}),Object(n["createVNode"])(z,{prop:"defaultValue",label:"default","min-width":"120"}),Object(n["createVNode"])(z,{prop:"comment",label:"comment"}),Object(n["createVNode"])(z,{prop:"remark",label:"remark","min-width":"160",resizable:"",fixed:"right"},{default:Object(n["withCtx"])((function(t){return[Object(n["createVNode"])(_,{onClick:function(a){return D.showRemarkDrawer(e.name,t.row.name)},size:"small",icon:D.Edit},null,8,["onClick","icon"])]})),_:2},1024)]})),_:2},1032,["data"])]})),_:2},1024)]})),_:2},1024),e.indexes.length>0?(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",j,[Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[O]})),_:1})]})),_:1}),Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(U,{data:e.indexes,border:"",fit:"",width:"80%"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(z,{type:"index"}),Object(n["createVNode"])(z,{prop:"name",label:"Name","min-width":"120"}),Object(n["createVNode"])(z,{prop:"isPrimary",label:"IsPrimary",width:"120"}),Object(n["createVNode"])(z,{prop:"isUnique",label:"Is Unique",width:"120"}),Object(n["createVNode"])(z,{prop:"columnNames",label:"Columns","min-width":"150"})]})),_:2},1032,["data"])]})),_:2},1024)]})),_:2},1024)])):Object(n["createCommentVNode"])("",!0),e.triggers.length>0?(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",p,[Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[f]})),_:1})]})),_:1}),Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(U,{data:e.triggers,fit:"",border:"",width:"80%"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(z,{type:"index"}),Object(n["createVNode"])(z,{prop:"name",label:"Name","min-width":"120"}),Object(n["createVNode"])(z,{prop:"timing",label:"timing"}),Object(n["createVNode"])(z,{prop:"manipulation",label:"manipulation",width:"120"}),Object(n["createVNode"])(z,{prop:"statement",label:"statement"}),Object(n["createVNode"])(z,{prop:"creatAt",label:"creatAt",width:"150"})]})),_:2},1032,["data"])]})),_:2},1024)]})),_:2},1024)])):Object(n["createCommentVNode"])("",!0)],64)})),128))]),Object(n["createElementVNode"])("div",g,[Object(n["createElementVNode"])("div",h,[Object(n["createElementVNode"])("ul",null,[(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(D.state.toc,(function(e,t){return Object(n["openBlock"])(),Object(n["createElementBlock"])("li",{key:t},[Object(n["createVNode"])(M,{underline:!1,onClick:function(t){return D.onClickToc(D.state.databaseDocument.databaseName+"."+e.name)}},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(e.name),1)]})),_:2},1032,["onClick"]),Object(n["createElementVNode"])("ul",null,[(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(e.child,(function(e,a){return Object(n["openBlock"])(),Object(n["createElementBlock"])("li",{key:t+"-"+a},[Object(n["createVNode"])(M,{underline:!1},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(e.name),1)]})),_:2},1024)])})),128))])])})),128))])])]),Object(n["createVNode"])(W,{content:"回到顶部",placement:"top"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(G,{bottom:100})]})),_:1}),Object(n["createVNode"])(H,{modelValue:D.remarkData.isShowDrawer,"onUpdate:modelValue":t[2]||(t[2]=function(e){return D.remarkData.isShowDrawer=e}),title:"更多",size:"50%"},{default:Object(n["withCtx"])((function(){return[(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(D.remarkData.pageData.content,(function(e,t){return Object(n["openBlock"])(),Object(n["createBlock"])(S,{key:t},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(L,{shadow:"never",class:"remark-card"},{header:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("div",V,[Object(n["createElementVNode"])("span",null,[Object(n["createElementVNode"])("span",N,Object(n["toDisplayString"])(e.remarkBy.nickname),1),Object(n["createElementVNode"])("span",w,Object(n["toDisplayString"])(e.createAt),1)]),Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createElementBlock"])("span",null,[Object(n["createVNode"])(A,{"confirm-button-text":"确定","cancel-button-text":"取消",icon:"InfoFilled","icon-color":"red",title:"确定要删除该记录吗?",onConfirm:function(t){return D.onDeleteRemark(e.id)}},{reference:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{type:"danger",icon:D.Delete,circle:"",plain:"",size:"small"},null,8,["icon"])]})),_:2},1032,["onConfirm"])])),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]])])]})),default:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("div",C,Object(n["toDisplayString"])(e.remark),1)]})),_:2},1024)]})),_:2},1024)]})),_:2},1024)})),128)),0==D.remarkData.pageData.content.length?(Object(n["openBlock"])(),Object(n["createBlock"])(S,{key:0},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(y)]})),_:1})]})),_:1})):Object(n["createCommentVNode"])("",!0),Object(n["createVNode"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(Y,{layout:"prev, pager, next","hide-on-single-page":!1,currentPage:D.remarkData.pageData.page,"page-size":D.remarkData.pageData.size,"page-count":D.remarkData.pageData.totalPages,onCurrentChange:D.onRemarkPageChange},null,8,["currentPage","page-size","page-count","onCurrentChange"])]})),_:1})]})),_:1}),Object(n["createVNode"])(q),Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(J,{modelValue:D.remarkData.formData.remark,"onUpdate:modelValue":t[1]||(t[1]=function(e){return D.remarkData.formData.remark=e}),rows:5,type:"textarea",placeholder:"请输入内容"},null,8,["modelValue"])]})),_:1})]})),_:1})),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]]),Object(n["createVNode"])(q),Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(S,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{onClick:D.onCreateRemark},{default:Object(n["withCtx"])((function(){return[k]})),_:1},8,["onClick"])]})),_:1})]})),_:1})),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]])]})),_:1},8,["modelValue"])]})),_:1})]})),_:1})]))}var x=a("1da1"),v=(a("d3b7"),a("159b"),a("96cf"),a("6c02")),_=a("1c1e"),y="/api/v1.0",E=function(e,t){return _["a"].get(y+"/projects/"+e+"/documents",{params:t})},B=function(e){return _["a"].post(y+"/projects/"+e+"/documents")},I=function(e,t){return _["a"].get(y+"/projects/"+e+"/document_versions",{params:t})},R=a("3ef4"),S=a("fc88"),P=a("53446"),T=a("0480"),F="/api/v1.0",z=function(e,t,a){return _["a"].delete(F+"/groups/"+e+"/projects/"+t+"/remarks/"+a)},U=function(e,t,a){return _["a"].post(F+"/groups/"+e+"/projects/"+t+"/remarks",a)},M=function(e,t,a){return _["a"].get(F+"/groups/"+e+"/projects/"+t+"/remarks",{params:a})},G={setup:function(){var e=Object(v["c"])(),t=Object(n["reactive"])({databaseDocumentVersionFilter:{page:0,size:10},databaseDocumentVersions:[],databaseDocumentVersionTotalPages:0,databaseDocumentFilter:{version:null},databaseDocument:null,toc:[],init:!1,loadings:{handleSync:!1,loadingVersions:!1},projectId:null,groupId:null});t.projectId=e.params.projectId,t.groupId=e.params.groupId;var a=Object(n["computed"])((function(){return!t.databaseDocument&&t.init})),r=Object(n["computed"])((function(){return!t.databaseDocument&&!t.init})),c=function(e,t){Object(R["a"])({showClose:!0,message:t,type:e,duration:3e3})},o=function(){var a=Object(x["a"])(regeneratorRuntime.mark((function a(){var n,r;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return a.next=2,I(e.params.projectId);case 2:return n=a.sent,t.databaseDocumentVersions=n.data.content,t.databaseDocumentVersionTotalPages=n.data.totalPages,a.next=7,E(e.params.projectId);case 7:r=a.sent,r.errCode?c("error","同步失败:"+r.errMessage):r.data?(t.databaseDocument=r.data,l(r.data)):c("warn","无可用数据"),t.init=!0;case 10:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}(),l=function(e){var a=[];a.push({name:"overview",child:[]}),e.tables.forEach((function(e){var t=[];a.push({name:e.name,child:t})})),t.toc=a},i=function(e){var t=document.getElementById(e);if(t){var a=-100,n=t.offsetTop,r=t.offsetParent;while(null!==r)n+=r.offsetTop,r=r.offsetParent;window.scrollTo({top:n+a,behavior:"smooth"})}},u=function(e){return null==e.decimalDigits?e.type+"("+e.size+")":e.type+"("+e.size+", "+e.decimalDigits+")"},d=function(){var a=Object(x["a"])(regeneratorRuntime.mark((function a(){var n;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return t.loadings.loadingVersions=!0,a.next=3,E(e.params.projectId,t.databaseDocumentFilter);case 3:n=a.sent,n.data?(t.databaseDocument=n.data,l(n.data),c("success","切换成功")):c("warn","无可用数据"),t.loadings.loadingVersions=!1;case 6:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}(),b=function(){var a=e.params.projectId;t.loadings.handleSync=!0,B(a).then((function(e){e.errCode||(o(),c("success","同步成功")),t.loadings.handleSync=!1})).catch((function(){return t.loadings.handleSync=!1}))},s=m(Object(x["a"])(regeneratorRuntime.mark((function a(){var n;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:if(t.loadings.loadingVersions=!0,!(t.databaseDocumentVersionFilter.page+1<t.databaseDocumentVersionTotalPages)){a.next=8;break}return t.databaseDocumentVersionFilter.page++,a.next=5,I(e.params.projectId,t.databaseDocumentVersionFilter);case 5:n=a.sent,t.databaseDocumentVersionTotalPages=n.data.totalPages,n.data.content.length>0&&n.data.content.forEach((function(e){return t.databaseDocumentVersions.push(e)}));case 8:t.loadings.loadingVersions=!1;case 9:case"end":return a.stop()}}),a)}))),800);function m(e,t){var a=null;return function(){var n=this,r=arguments;a&&clearTimeout(a),a=setTimeout((function(){e.apply(n,r)}),t)}}o();var j=Object(n["reactive"])({isShowDrawer:!1,formData:{remark:null},pageFilter:{page:0,size:5,tableName:null,columnName:null},pageData:{content:[],page:0,size:10,totalPages:0}}),O=function(t,a){j.isShowDrawer=!0,j.pageFilter.tableName=t||null,j.pageFilter.columnName=a||null;var n=e.params.projectId,r=e.params.groupId;M(r,n,j.pageFilter).then((function(e){j.pageData=e.data,j.pageData.page=e.data.number+1}))},p=function(t){j.pageFilter.page=t-1;var a=e.params.projectId,n=e.params.groupId;M(n,a,j.pageFilter).then((function(e){j.pageData=e.data,j.pageData.page=e.data.number+1}))},f=function(){if(j.formData.remark&&""!=j.formData.remark){var t=e.params.projectId,a=e.params.groupId,n={tableName:j.pageFilter.tableName,columnName:j.pageFilter.columnName,remark:j.formData.remark};U(a,t,n).then((function(e){e.errCode||(j.formData.remark=null,c("success","提交成功"),p(1))}))}else c("warning","内容不能为空")},g=function(t){var a=e.params.projectId,n=e.params.groupId;z(n,a,t).then((function(e){e.errCode||(c("success","删除成功"),p(1))}))};return{Delete:S["a"],More:P["a"],Edit:T["a"],state:t,isShowNoDataPage:a,isShowLoadingPage:r,onClickToc:i,columnTypeFormat:u,loadMoreDocumentVersions:s,onProjectDocumentVersionChange:d,onSyncProjectDocument:b,remarkData:j,showRemarkDrawer:O,onRemarkPageChange:p,onCreateRemark:f,onDeleteRemark:g}}},W=(a("b2aa"),a("6b0d")),A=a.n(W);const L=A()(G,[["render",D]]);t["default"]=L},"1a6f":function(e,t,a){},b2aa:function(e,t,a){"use strict";a("1a6f")}}]);
-//# sourceMappingURL=chunk-3bf24d18.e5da42ea.js.map
\ No newline at end of file
diff --git a/api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js.map b/api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js.map
deleted file mode 100644
index 68c7f20..0000000
--- a/api/src/main/resources/static/js/chunk-3bf24d18.e5da42ea.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["webpack:///./src/views/Document.vue","webpack:///./src/api/Document.js","webpack:///./src/api/DocumentRemark.js","webpack:///./src/views/Document.vue?22f9","webpack:///./src/views/Document.vue?fe0f"],"names":["class","isShowNoDataPage","description","type","icon","round","size","onSyncProjectDocument","loading","state","loadings","handleSync","isShowLoadingPage","rows","init","gutter","span","style","groupId","onProjectDocumentVersionChange","databaseDocumentFilter","version","placeholder","clearable","databaseDocumentVersions","item","key","label","createAt","value","loadMoreDocumentVersions","loadingVersions","column","border","label-align","width","databaseDocument","databaseName","productName","productVersion","documentVersion","id","data","tables","prop","min-width","resizable","showRemarkDrawer","scope","row","name","Edit","tableMeta","columns","length","fit","formatter","columnTypeFormat","fixed","indexes","triggers","toc","index","underline","onClickToc","child","childItem","childIndex","content","placement","bottom","remarkData","isShowDrawer","title","pageData","remark","shadow","header","remarkBy","nickname","confirm-button-text","cancel-button-text","icon-color","onDeleteRemark","reference","Delete","circle","plain","layout","hide-on-single-page","currentPage","page","page-size","page-count","totalPages","onRemarkPageChange","formData","onCreateRemark","base","getOneByProjectId","projectId","parameters","axios","get","params","syncByProjectId","post","getVersionByProjectId","deleteRemark","remarkId","delete","createRemark","body","listRemarks","setup","route","databaseDocumentVersionFilter","databaseDocumentVersionTotalPages","messageNotify","msg","showClose","message","duration","fetchDatabaseMetaData","versionResp","resp","errCode","errMessage","initTocByDocumentData","push","forEach","ele","document","getElementById","headerOffset","actualTop","offsetTop","current","offsetParent","window","scrollTo","top","behavior","decimalDigits","then","catch","debounce","element","fn","delay","timer","context","this","args","arguments","clearTimeout","setTimeout","apply","pageFilter","tableName","columnName","number","More","__exports__","render"],"mappings":"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","file":"js/chunk-3bf24d18.e5da42ea.js","sourcesContent":["<template>\n  <div v-if=\"isShowNoDataPage\">\n      <el-empty description=\"似乎还没有同步过文档\" >\n          <el-button type=\"primary\" icon='refresh' round size='large' @click=\"onSyncProjectDocument\" :loading=\"state.loadings.handleSync\">同步</el-button>\n      </el-empty>\n  </div>\n  <div v-else-if=\"isShowLoadingPage\">\n    <el-skeleton v-loading=\"!state.init\" :rows=\"12\" />\n  </div>\n  <div v-else>\n    <el-container class=\"document-container\">\n      <el-header>\n          <el-row :gutter=\"20\">\n            <el-col :span=\"2\" v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n              <el-button type=\"success\" style=\"width:100%\" icon=\"Refresh\" @click=\"onSyncProjectDocument\" :loading=\"state.loadings.handleSync\">同步</el-button>\n            </el-col>\n            <el-col :span=\"2\" v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n                <el-button type=\"primary\" style=\"width:100%\" icon=\"Download\">导出</el-button>\n            </el-col>\n            <el-col :span=\"4\">\n                <el-select @change=\"onProjectDocumentVersionChange\" v-model=\"state.databaseDocumentFilter.version\" placeholder=\"历史版本\" v-select-more=\"loadMoreDocumentVersions\" v-loading=\"state.loadings.loadingVersions\" clearable>\n                  <el-option\n                  v-for=\"item in state.databaseDocumentVersions\"\n                  :key=\"item.version\"\n                  :label=\"'['+item.createAt +']->'+item.version+''\"\n                  :value=\"item.version\"\n                  >\n                  </el-option>\n              </el-select>\n            </el-col>\n          </el-row>\n      </el-header>\n      \n      <el-main class=\"document-content-wrapper\">\n        \n        <div class=\"document-content\">\n        <el-row>\n          <!-- database overview -->\n          <el-col>\n            <el-descriptions :column=\"1\" size=\"large\" border>\n              <el-descriptions-item label=\"Database Name\" label-align=\"left\" width='200px'>{{ state.databaseDocument.databaseName }}</el-descriptions-item>\n              <el-descriptions-item label=\"Product Name\" label-align=\"left\">{{ state.databaseDocument.productName }}</el-descriptions-item>\n              <el-descriptions-item label=\"Product Version\" label-align=\"left\">{{ state.databaseDocument.productVersion }}</el-descriptions-item>\n              <el-descriptions-item label=\"Document Version\" label-align=\"left\">{{ state.databaseDocument.documentVersion }}</el-descriptions-item>\n              <el-descriptions-item label=\"Create At\" label-align=\"left\">{{ state.databaseDocument.createAt }}</el-descriptions-item>\n            </el-descriptions>\n          </el-col>\n        </el-row>\n\n        <!-- table overview -->\n        <el-row>\n          <el-col>\n            <h2 :id=\"state.databaseDocument.databaseName + '.overview'\">Overview</h2>\n          </el-col>\n        </el-row>\n        <el-row>\n          <el-col>\n            <el-table :data=\"state.databaseDocument.tables\"  border width='80%'>\n              <el-table-column type=\"index\" />\n              <el-table-column prop=\"name\" label=\"Name\" min-width=\"160\" resizable />\n              <el-table-column prop=\"type\" label=\"Type\" width=\"200\"  resizable />\n              <el-table-column prop=\"comment\" label=\"comment\" min-width=\"160\" resizable />\n              <el-table-column prop=\"remark\" label=\"remark\" min-width=\"160\" resizable >\n                <template v-slot=\"scope\">\n                    <el-button @click=\"showRemarkDrawer(scope.row.name)\" size=\"small\" :icon=\"Edit\"></el-button>\n                </template>\n              </el-table-column>\n            </el-table>\n          </el-col>\n        </el-row>\n\n        <!-- table details -->\n        <template v-for=\"tableMeta in state.databaseDocument.tables\" :key=\"tableMeta\">\n          <el-row>\n            <el-col>\n              <h2 :id=\"state.databaseDocument.databaseName + '.' + tableMeta.name\">{{ tableMeta.name }}</h2>\n            </el-col>\n          </el-row>\n          \n          <el-row>\n            <el-col v-if=\"tableMeta.columns.length > 0\">\n              <h3>Columns</h3>\n            </el-col>\n          </el-row>\n          <el-row>\n            <el-col >\n              <el-table :data=\"tableMeta.columns\" border fit width='80%'>\n                <el-table-column type=\"index\" />\n                <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\n                <el-table-column prop=\"type\" :formatter=\"columnTypeFormat\" label=\"Type\" width=\"140\" />\n                <el-table-column prop=\"nullable\" label=\"Is Nullable\" width=\"120\" />\n                <el-table-column prop=\"autoIncrement\" label=\"Auto increment\" width=\"140\" />\n                <el-table-column prop=\"defaultValue\" label=\"default\" min-width=\"120\" />\n                <el-table-column prop=\"comment\" label=\"comment\"  />\n                <el-table-column prop=\"remark\" label=\"remark\" min-width=\"160\" resizable fixed=\"right\">\n                  <template v-slot=\"scope\">\n                      <el-button @click=\"showRemarkDrawer(tableMeta.name, scope.row.name)\" size=\"small\" :icon=\"Edit\"></el-button>\n                  </template>\n                </el-table-column>\n              </el-table>\n            </el-col>\n          </el-row>\n        \n          <div v-if=\"tableMeta.indexes.length > 0\">\n            <el-row>\n              <el-col>\n                <h3>Indexes</h3>            \n              </el-col>\n            </el-row>\n            <el-row>\n              <el-col >\n                <el-table :data=\"tableMeta.indexes\" border fit width='80%'>\n                  <el-table-column type=\"index\" />\n                  <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\n                  <el-table-column prop=\"isPrimary\" label=\"IsPrimary\" width=\"120\" />\n                  <el-table-column prop=\"isUnique\" label=\"Is Unique\" width=\"120\" />\n                  <el-table-column prop=\"columnNames\" label=\"Columns\" min-width=\"150\" />\n                </el-table>\n              </el-col>\n            </el-row>\n          </div>\n          \n          <div  v-if=\"tableMeta.triggers.length > 0\">\n            <el-row>\n              <el-col>\n                <h3>Triggers</h3>\n              </el-col>\n            </el-row>\n            <el-row>\n              <el-col >\n                <el-table :data=\"tableMeta.triggers\" fit border width='80%'>\n                  <el-table-column type=\"index\" />\n                  <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\n                  <el-table-column prop=\"timing\" label=\"timing\" />\n                  <el-table-column prop=\"manipulation\" label=\"manipulation\" width=\"120\" />\n                  <el-table-column prop=\"statement\" label=\"statement\" />\n                  <el-table-column prop=\"creatAt\" label=\"creatAt\" width=\"150\" />\n                </el-table>\n              </el-col>\n            </el-row>\n          </div>\n\n        </template>\n        </div>\n        <div class=\"toc-wrapper\">\n          <div class=\"toc\">\n            <ul>\n              <li v-for=\"(item, index) in state.toc\" :key=\"index\">\n                <el-link :underline=\"false\" @click=\"onClickToc(state.databaseDocument.databaseName +'.'+ item.name)\">\n                  {{ item.name }}\n                </el-link>\n                <ul>\n                  <li v-for=\"(childItem, childIndex) in item.child\" :key=\"index+'-'+childIndex\"><el-link :underline=\"false\">{{ childItem.name }}</el-link></li>\n                </ul>\n              </li>\n            </ul>\n          </div>\n        </div>\n        <el-tooltip\n          content=\"回到顶部\"\n          placement=\"top\"\n        >\n          <el-backtop :bottom=\"100\"></el-backtop>\n        </el-tooltip>\n\n        <!-- remarks -->\n        <el-drawer\n          v-model=\"remarkData.isShowDrawer\"\n          title=\"更多\"\n          size=\"50%\"\n        >\n\n          <el-row v-for=\"(remark, index) in remarkData.pageData.content\" :key=\"index\">\n            <el-col>\n              <el-card shadow=\"never\" class=\"remark-card\"> \n                <template #header>\n                <div class=\"remark-header\">\n                  <span>\n                    <span class=\"remark-user\">{{remark.remarkBy.nickname}}</span>  \n                    <span class=\"remark-time\">{{remark.createAt}}</span>\n                  </span>\n                  <span v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n<el-popconfirm\n                    confirm-button-text=\"确定\"\n                    cancel-button-text=\"取消\"\n                    icon=\"InfoFilled\"\n                    icon-color=\"red\"\n                    title=\"确定要删除该记录吗?\"\n                    @confirm=\"onDeleteRemark(remark.id)\"\n                    \n                    >\n                      <template #reference>\n                        <el-button type=\"danger\" :icon=\"Delete\" circle plain size=\"small\"></el-button>\n                      </template>\n                    </el-popconfirm>\n                  </span>\n                    \n                  \n                </div>\n                </template>\n                  <div class=\"item text remark-content\">\n                    {{ remark.remark }}\n                  </div>\n              </el-card>\n            </el-col>\n          </el-row>\n          <el-row v-if=\"remarkData.pageData.content.length == 0\">\n            <el-col>\n              <el-empty></el-empty>\n            </el-col>\n          </el-row>\n\n          <el-row>\n            <el-col>\n              <el-pagination layout=\"prev, pager, next\" \n                :hide-on-single-page=\"false\"\n                :currentPage=\"remarkData.pageData.page\" \n                :page-size=\"remarkData.pageData.size\" \n                :page-count=\"remarkData.pageData.totalPages\"\n                @current-change=\"onRemarkPageChange\">\n              </el-pagination>\n            </el-col>\n          </el-row>\n          <el-divider></el-divider>\n          <el-row v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n            <el-col>\n              <el-input\n                v-model=\"remarkData.formData.remark\"\n                :rows=\"5\"\n                type=\"textarea\" \n                placeholder=\"请输入内容\"\n              />\n            </el-col>\n          </el-row>\n          <el-divider></el-divider>\n\n          <el-row v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n            <el-col>\n              <el-button @click=\"onCreateRemark\">提交</el-button>\n            </el-col>\n          </el-row>\n        </el-drawer>\n      </el-main>\n    </el-container>\n  </div>\n</template>\n\n<style>\n\n.remark-card {\n  margin-bottom: 30px;\n}\n\n.remark-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.remark-header .remark-user {\n  color: rgb(109, 109, 109);\n}\n\n.remark-header .remark-time {\n  color: rgb(109, 109, 109);\n  font-size: 0.8rem;\n  margin-left: 10px;\n}\n\n\n.remark-content {\n  white-space: pre-wrap;\n  text-align: left;\n}\n\n.text {\n  font-size: 14px;\n  line-height: 1.3rem;\n}\n\n.item {\n  margin-top: 10px;\n  margin-right: 40px;\n}\n\n.toc-wrapper {\n  right:0;\n  top: 60;\n  z-index: 0;\n  bottom: auto;\n  padding-left: 33px;\n  margin-left: 10px;\n}\n\n.toc {\n  top: 130px;\n  position: fixed;\n  margin-left: 0;\n  transform: scale(1, 1);\n  bottom:0;\n  position:fixed;\n  overflow-y:hidden;\n  overflow-x:hidden;\n}\n\n.toc:hover {\n  overflow-y: auto;\n}\n\n.toc-wrapper .toc ul {\n    list-style: none;\n    line-height: 1.7;\n    inline-size: 200px;\n    overflow-wrap: break-word;\n}\n\n.toc-wrapper .toc a {\n    display: inherit;\n}\n\n.document-content-wrapper {\n  display: flex;\n  margin: 0;\n  min-width: 50rem;\n  max-width: 60rem;\n}\n\n.document-content {\n  min-width: 50rem;\n}\n\n\n</style>\n\n<script>\nimport { reactive, computed } from 'vue'\nimport {  useRoute } from 'vue-router'\nimport { getOneByProjectId, syncByProjectId, getVersionByProjectId } from '@/api/Document'\nimport { ElMessage } from 'element-plus'\nimport { Delete, More, Edit } from '@element-plus/icons'\nimport { listRemarks, createRemark, deleteRemark } from '@/api/DocumentRemark'\n\nexport default {\n  setup() {\n    const route = useRoute()\n    const state = reactive({\n      databaseDocumentVersionFilter: {\n        page: 0,\n        size: 10,\n      },\n      databaseDocumentVersions: [],\n      databaseDocumentVersionTotalPages: 0,\n      databaseDocumentFilter: {\n        version: null\n      },\n      databaseDocument: null,\n      toc: [],\n      init: false,\n      loadings: {\n        handleSync: false,\n        loadingVersions: false\n      },\n      projectId: null,\n      groupId: null\n    })\n\n    state.projectId = route.params.projectId\n    state.groupId = route.params.groupId\n    const isShowNoDataPage = computed(() => !state.databaseDocument && state.init)\n    const isShowLoadingPage = computed(() => !state.databaseDocument && !state.init)\n\n    const messageNotify = (type, msg) => {\n      ElMessage({\n            showClose: true,\n            message: msg,\n            type: type,\n            duration: 3 * 1000\n        });\n    }\n\n    const fetchDatabaseMetaData = async () => {\n      // fetch version\n      const versionResp = await getVersionByProjectId(route.params.projectId)\n      state.databaseDocumentVersions = versionResp.data.content\n      state.databaseDocumentVersionTotalPages = versionResp.data.totalPages\n\n      // fetch meta\n      const resp = await getOneByProjectId(route.params.projectId)\n      if (resp.errCode) {\n        messageNotify('error', '同步失败:'+resp.errMessage)\n      } else if (resp.data) {\n        state.databaseDocument = resp.data\n        initTocByDocumentData(resp.data)\n      } else {\n        messageNotify('warn', '无可用数据')\n      }\n      state.init = true\n    }\n\n    const initTocByDocumentData = (data) => {\n      const toc = []\n      toc.push({ name: 'overview', child: [] })\n      data.tables.forEach(item => {\n        const child = []\n        toc.push({ name: item.name, child: child })\n      })\n      state.toc = toc\n    }\n\n    const onClickToc = (id) => {\n      const ele = document.getElementById(id)\n      if (ele) {\n        var headerOffset = -100;\n        var actualTop = ele.offsetTop;\n        var current = ele.offsetParent;\n          while (current !== null){\n          actualTop += current.offsetTop;\n          current = current.offsetParent;\n        }\n        window.scrollTo({\n          top: actualTop + headerOffset,\n          behavior: \"smooth\"\n        })\n      }\n    }\n\n    const columnTypeFormat = (column) => {\n      if (column.decimalDigits == null) {\n        return column.type + '('+column.size+')' \n      } else {\n        return column.type + '('+column.size+', '+column.decimalDigits+')'\n      }\n    }\n\n    const onProjectDocumentVersionChange = async () => {\n      state.loadings.loadingVersions = true\n      const resp =  await getOneByProjectId(route.params.projectId, state.databaseDocumentFilter)\n      if (resp.data) {\n        state.databaseDocument = resp.data\n        initTocByDocumentData(resp.data)\n        messageNotify('success', '切换成功')\n      } else {\n        messageNotify('warn', '无可用数据')\n      }\n      state.loadings.loadingVersions = false\n    }\n\n    const onSyncProjectDocument = () => {\n      const projectId = route.params.projectId\n      state.loadings.handleSync = true\n      syncByProjectId(projectId)\n      .then(resp => {\n        if (!resp.errCode) {\n          fetchDatabaseMetaData()\n          messageNotify('success', '同步成功')\n        }\n        state.loadings.handleSync = false\n      })\n      .catch(() => state.loadings.handleSync = false)\n    }\n\n    const loadMoreDocumentVersions = debounce(async () => {\n        state.loadings.loadingVersions = true\n        if (state.databaseDocumentVersionFilter.page + 1  < state.databaseDocumentVersionTotalPages) {\n          state.databaseDocumentVersionFilter.page++\n          const versionResp = await  getVersionByProjectId(route.params.projectId, state.databaseDocumentVersionFilter)\n          state.databaseDocumentVersionTotalPages = versionResp.data.totalPages\n          if (versionResp.data.content.length > 0){\n            versionResp.data.content.forEach(element => state.databaseDocumentVersions.push(element))\n          }\n        }\n        state.loadings.loadingVersions = false\n    }, 800)\n\n    fetchDatabaseMetaData()\n\n    // 节流\n    function debounce(fn, delay) {\n      let timer = null\n      return function () {\n        let context = this\n        let args = arguments\n        if(timer) {\n            clearTimeout(timer)\n        }\n        timer = setTimeout(function () {\n          fn.apply(context, args)\n        }, delay)\n      }\n    }\n\n    // remarks\n    const remarkData = reactive({\n      isShowDrawer: false,\n      formData: {\n        remark: null,\n      },\n      pageFilter: {\n        page: 0,\n        size: 5,\n        tableName: null,\n        columnName: null\n      },\n      pageData: {\n        content: [],\n        page: 0,\n        size: 10,\n        totalPages: 0\n      },\n    })\n    const showRemarkDrawer = (tableName, columnName) => {\n      remarkData.isShowDrawer = true\n      if (tableName) {\n        remarkData.pageFilter.tableName = tableName\n      } else {\n        remarkData.pageFilter.tableName = null\n      }\n      if(columnName) {\n        remarkData.pageFilter.columnName = columnName\n      } else {\n        remarkData.pageFilter.columnName = null\n      }\n      const projectId = route.params.projectId\n      const groupId = route.params.groupId\n      listRemarks(groupId, projectId, remarkData.pageFilter).then(resp => {\n        remarkData.pageData = resp.data\n        remarkData.pageData.page = resp.data.number + 1\n      })\n    }\n\n    const onRemarkPageChange = (currentPage) => {\n      remarkData.pageFilter.page = currentPage - 1\n      const projectId = route.params.projectId\n      const groupId = route.params.groupId\n      listRemarks(groupId, projectId, remarkData.pageFilter).then(resp => {\n        remarkData.pageData = resp.data\n        remarkData.pageData.page = resp.data.number + 1\n      })\n    }\n\n    const onCreateRemark = () => {\n      if(!remarkData.formData.remark || remarkData.formData.remark == '') {\n        messageNotify('warning', '内容不能为空')\n        return\n      }\n      const projectId = route.params.projectId\n      const groupId = route.params.groupId\n      const body  = {\n        tableName: remarkData.pageFilter.tableName,\n        columnName: remarkData.pageFilter.columnName,\n        remark: remarkData.formData.remark\n      }\n      createRemark(groupId, projectId, body).then(resp => {\n        if(!resp.errCode) {\n          remarkData.formData.remark = null\n          messageNotify('success', '提交成功')\n          onRemarkPageChange(1)\n        }\n      })\n    }\n\n    const onDeleteRemark = (remarkId) => {\n      const projectId = route.params.projectId\n      const groupId = route.params.groupId\n      deleteRemark(groupId, projectId, remarkId).then(resp => {\n        if(!resp.errCode) {\n          messageNotify('success', '删除成功')\n          onRemarkPageChange(1)\n        }\n      })\n    }\n\n    return {\n      Delete,\n      More,\n      Edit,\n      state,\n      isShowNoDataPage,\n      isShowLoadingPage,\n      onClickToc,\n      columnTypeFormat,\n      loadMoreDocumentVersions,\n      onProjectDocumentVersionChange,\n      onSyncProjectDocument,\n      remarkData,\n      showRemarkDrawer,\n      onRemarkPageChange,\n      onCreateRemark,\n      onDeleteRemark\n    }\n  }\n}\n\n</script>","import axios from '@/utils/fetch';\n\nconst base = '/api/v1.0'\n\nexport const getOneByProjectId = (projectId, parameters) => {\n    return axios.get(base + '/projects/'+projectId+'/documents', {\n        params: parameters\n    })\n}\n\nexport const syncByProjectId = (projectId) => {\n    return axios.post(base + \"/projects/\"+projectId+\"/documents\")\n}\n\nexport const getVersionByProjectId =(projectId, parameters) => {\n    return axios.get(base + \"/projects/\"+projectId+\"/document_versions\", {\n        params: parameters\n    })\n}\n","import axios from '@/utils/fetch';\n\nconst base = '/api/v1.0'\n\nexport const deleteRemark = (groupId, projectId, remarkId) => {\n    return axios.delete(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks/'+remarkId)\n}\n\nexport const createRemark = (groupId, projectId, body) => {\n    return axios.post(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks', body)\n}\n\nexport const listRemarks = (groupId, projectId, parameters) => {\n    return axios.get(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks', {\n        params: parameters\n    })\n}\n\n","import { render } from \"./Document.vue?vue&type=template&id=635503b2\"\nimport script from \"./Document.vue?vue&type=script&lang=js\"\nexport * from \"./Document.vue?vue&type=script&lang=js\"\n\nimport \"./Document.vue?vue&type=style&index=0&id=635503b2&lang=css\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./Document.vue?vue&type=style&index=0&id=635503b2&lang=css\""],"sourceRoot":""}
\ No newline at end of file
diff --git a/api/src/main/resources/static/js/chunk-4935816e.627c0115.js b/api/src/main/resources/static/js/chunk-4935816e.627c0115.js
new file mode 100644
index 0000000..dfcdda2
--- /dev/null
+++ b/api/src/main/resources/static/js/chunk-4935816e.627c0115.js
@@ -0,0 +1,2 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-4935816e"],{"0742":function(e,t,a){"use strict";a.r(t);a("b0c0");var n=a("7a23"),r={key:0},c=Object(n["createTextVNode"])("同步"),o={key:1},l={key:2},i=Object(n["createTextVNode"])("同步"),u=Object(n["createTextVNode"])("导出"),d={class:"document-content"},b=["id"],s=["id"],j=Object(n["createElementVNode"])("h3",null,"Columns",-1),O={key:0},m=Object(n["createElementVNode"])("h3",null,"Indexes",-1),p={key:1},f=Object(n["createElementVNode"])("h3",null,"Triggers",-1),g={class:"toc-wrapper"},h={class:"toc"},V={class:"remark-header"},w={class:"remark-user"},N={class:"remark-time"},C={class:"item text remark-content"},k=Object(n["createTextVNode"])("提交");function D(e,t,a,D,x,v){var _=Object(n["resolveComponent"])("el-button"),y=Object(n["resolveComponent"])("el-empty"),E=Object(n["resolveComponent"])("el-skeleton"),B=Object(n["resolveComponent"])("el-col"),S=Object(n["resolveComponent"])("el-option"),I=Object(n["resolveComponent"])("el-select"),R=Object(n["resolveComponent"])("el-row"),P=Object(n["resolveComponent"])("el-header"),T=Object(n["resolveComponent"])("el-descriptions-item"),F=Object(n["resolveComponent"])("el-descriptions"),z=Object(n["resolveComponent"])("el-table-column"),U=Object(n["resolveComponent"])("el-table"),M=Object(n["resolveComponent"])("el-link"),Y=Object(n["resolveComponent"])("el-backtop"),G=Object(n["resolveComponent"])("el-tooltip"),W=Object(n["resolveComponent"])("el-popconfirm"),A=Object(n["resolveComponent"])("el-card"),L=Object(n["resolveComponent"])("el-pagination"),q=Object(n["resolveComponent"])("el-divider"),J=Object(n["resolveComponent"])("el-input"),K=Object(n["resolveComponent"])("el-drawer"),H=Object(n["resolveComponent"])("el-main"),Q=Object(n["resolveComponent"])("el-container"),X=Object(n["resolveDirective"])("loading"),Z=Object(n["resolveDirective"])("require-roles"),$=Object(n["resolveDirective"])("select-more");return D.isShowNoDataPage?(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",r,[Object(n["createVNode"])(y,{description:"似乎还没有同步过文档"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{type:"primary",icon:"refresh",round:"",size:"large",onClick:D.onSyncProjectDocument,loading:D.state.loadings.handleSync},{default:Object(n["withCtx"])((function(){return[c]})),_:1},8,["onClick","loading"])]})),_:1})])):D.isShowLoadingPage?(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",o,[Object(n["withDirectives"])(Object(n["createVNode"])(E,{rows:12},null,512),[[X,!D.state.init]])])):(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",l,[Object(n["createVNode"])(Q,{class:"document-container"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(P,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(R,{gutter:20},{default:Object(n["withCtx"])((function(){return[Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(B,{span:2},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{type:"success",style:{width:"100%"},icon:"Refresh",onClick:D.onSyncProjectDocument,loading:D.state.loadings.handleSync},{default:Object(n["withCtx"])((function(){return[i]})),_:1},8,["onClick","loading"])]})),_:1})),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]]),Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(B,{span:2},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{type:"primary",style:{width:"100%"},icon:"Download"},{default:Object(n["withCtx"])((function(){return[u]})),_:1})]})),_:1})),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]]),Object(n["createVNode"])(B,{span:4},{default:Object(n["withCtx"])((function(){return[Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(I,{onChange:D.onProjectDocumentVersionChange,modelValue:D.state.databaseDocumentFilter.version,"onUpdate:modelValue":t[0]||(t[0]=function(e){return D.state.databaseDocumentFilter.version=e}),placeholder:"历史版本",clearable:""},{default:Object(n["withCtx"])((function(){return[(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(D.state.databaseDocumentVersions,(function(e){return Object(n["openBlock"])(),Object(n["createBlock"])(S,{key:e.version,label:"["+e.createAt+"]->"+e.version,value:e.version},null,8,["label","value"])})),128))]})),_:1},8,["onChange","modelValue"])),[[$,D.loadMoreDocumentVersions],[X,D.state.loadings.loadingVersions]])]})),_:1})]})),_:1})]})),_:1}),Object(n["createVNode"])(H,{class:"document-content-wrapper"},{default:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("div",d,[Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(F,{column:1,size:"large",border:""},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(T,{label:"Database Name","label-align":"left",width:"200px"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.databaseName),1)]})),_:1}),Object(n["createVNode"])(T,{label:"Product Name","label-align":"left"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.productName),1)]})),_:1}),Object(n["createVNode"])(T,{label:"Product Version","label-align":"left"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.productVersion),1)]})),_:1}),Object(n["createVNode"])(T,{label:"Document Version","label-align":"left"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.documentVersion),1)]})),_:1}),Object(n["createVNode"])(T,{label:"Create At","label-align":"left"},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(D.state.databaseDocument.createAt),1)]})),_:1})]})),_:1})]})),_:1})]})),_:1}),Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("h2",{id:D.state.databaseDocument.databaseName+".overview"},"Overview",8,b)]})),_:1})]})),_:1}),Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(U,{data:D.state.databaseDocument.tables,border:"",width:"80%"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(z,{type:"index"}),Object(n["createVNode"])(z,{prop:"name",label:"Name","min-width":"160",resizable:""}),Object(n["createVNode"])(z,{prop:"type",label:"Type",width:"200",resizable:""}),Object(n["createVNode"])(z,{prop:"comment",label:"comment","min-width":"160",resizable:""}),Object(n["createVNode"])(z,{prop:"remark",label:"remark","min-width":"160",resizable:""},{default:Object(n["withCtx"])((function(e){return[Object(n["createVNode"])(_,{onClick:function(t){return D.showRemarkDrawer(e.row.name)},size:"small",icon:D.Edit},null,8,["onClick","icon"])]})),_:1})]})),_:1},8,["data"])]})),_:1})]})),_:1}),(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(D.state.databaseDocument.tables,(function(e){return Object(n["openBlock"])(),Object(n["createElementBlock"])(n["Fragment"],{key:e},[Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("h2",{id:D.state.databaseDocument.databaseName+"."+e.name},Object(n["toDisplayString"])(e.name),9,s)]})),_:2},1024)]})),_:2},1024),Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[e.columns.length>0?(Object(n["openBlock"])(),Object(n["createBlock"])(B,{key:0},{default:Object(n["withCtx"])((function(){return[j]})),_:1})):Object(n["createCommentVNode"])("",!0)]})),_:2},1024),Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(U,{data:e.columns,border:"",fit:"",width:"80%"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(z,{type:"index"}),Object(n["createVNode"])(z,{prop:"name",label:"Name","min-width":"120"}),Object(n["createVNode"])(z,{prop:"type",formatter:D.columnTypeFormat,label:"Type",width:"140"},null,8,["formatter"]),Object(n["createVNode"])(z,{label:"Primary Key",width:"120"},{default:Object(n["withCtx"])((function(e){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(e.row.isPrimaryKey?"YES":""),1)]})),_:1}),Object(n["createVNode"])(z,{prop:"nullable",label:"Is Nullable",width:"120"},{default:Object(n["withCtx"])((function(e){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])("YES"==e.row.nullable?"YES":""),1)]})),_:1}),Object(n["createVNode"])(z,{prop:"autoIncrement",label:"Auto increment",width:"140"},{default:Object(n["withCtx"])((function(e){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])("YES"==e.row.autoIncrement?"YES":""),1)]})),_:1}),Object(n["createVNode"])(z,{prop:"defaultValue",label:"default","min-width":"120"}),Object(n["createVNode"])(z,{prop:"comment",label:"comment"}),Object(n["createVNode"])(z,{prop:"remark",label:"remark","min-width":"160",resizable:"",fixed:"right"},{default:Object(n["withCtx"])((function(t){return[Object(n["createVNode"])(_,{onClick:function(a){return D.showRemarkDrawer(e.name,t.row.name)},size:"small",icon:D.Edit},null,8,["onClick","icon"])]})),_:2},1024)]})),_:2},1032,["data"])]})),_:2},1024)]})),_:2},1024),e.indexes.length>0?(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",O,[Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[m]})),_:1})]})),_:1}),Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(U,{data:e.indexes,border:"",fit:"",width:"80%"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(z,{type:"index"}),Object(n["createVNode"])(z,{prop:"name",label:"Name","min-width":"120"}),Object(n["createVNode"])(z,{prop:"isUnique",label:"Is Unique",width:"120"},{default:Object(n["withCtx"])((function(e){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(e.row.isUnique?"YES":""),1)]})),_:1}),Object(n["createVNode"])(z,{prop:"columnNames",label:"Columns","min-width":"150"})]})),_:2},1032,["data"])]})),_:2},1024)]})),_:2},1024)])):Object(n["createCommentVNode"])("",!0),e.triggers.length>0?(Object(n["openBlock"])(),Object(n["createElementBlock"])("div",p,[Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[f]})),_:1})]})),_:1}),Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(U,{data:e.triggers,fit:"",border:"",width:"80%"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(z,{type:"index"}),Object(n["createVNode"])(z,{prop:"name",label:"Name","min-width":"120"}),Object(n["createVNode"])(z,{prop:"timing",label:"timing"}),Object(n["createVNode"])(z,{prop:"manipulation",label:"manipulation",width:"120"}),Object(n["createVNode"])(z,{prop:"statement",label:"statement"}),Object(n["createVNode"])(z,{prop:"creatAt",label:"creatAt",width:"150"})]})),_:2},1032,["data"])]})),_:2},1024)]})),_:2},1024)])):Object(n["createCommentVNode"])("",!0)],64)})),128))]),Object(n["createElementVNode"])("div",g,[Object(n["createElementVNode"])("div",h,[Object(n["createElementVNode"])("ul",null,[(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(D.state.toc,(function(e,t){return Object(n["openBlock"])(),Object(n["createElementBlock"])("li",{key:t},[Object(n["createVNode"])(M,{underline:!1,onClick:function(t){return D.onClickToc(D.state.databaseDocument.databaseName+"."+e.name)}},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(e.name),1)]})),_:2},1032,["onClick"]),Object(n["createElementVNode"])("ul",null,[(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(e.child,(function(e,a){return Object(n["openBlock"])(),Object(n["createElementBlock"])("li",{key:t+"-"+a},[Object(n["createVNode"])(M,{underline:!1},{default:Object(n["withCtx"])((function(){return[Object(n["createTextVNode"])(Object(n["toDisplayString"])(e.name),1)]})),_:2},1024)])})),128))])])})),128))])])]),Object(n["createVNode"])(G,{content:"回到顶部",placement:"top"},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(Y,{bottom:100})]})),_:1}),Object(n["createVNode"])(K,{modelValue:D.remarkData.isShowDrawer,"onUpdate:modelValue":t[2]||(t[2]=function(e){return D.remarkData.isShowDrawer=e}),title:"更多",size:"50%"},{default:Object(n["withCtx"])((function(){return[(Object(n["openBlock"])(!0),Object(n["createElementBlock"])(n["Fragment"],null,Object(n["renderList"])(D.remarkData.pageData.content,(function(e,t){return Object(n["openBlock"])(),Object(n["createBlock"])(R,{key:t},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(A,{shadow:"never",class:"remark-card"},{header:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("div",V,[Object(n["createElementVNode"])("span",null,[Object(n["createElementVNode"])("span",w,Object(n["toDisplayString"])(e.remarkBy.nickname),1),Object(n["createElementVNode"])("span",N,Object(n["toDisplayString"])(e.createAt),1)]),Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createElementBlock"])("span",null,[Object(n["createVNode"])(W,{"confirm-button-text":"确定","cancel-button-text":"取消",icon:"InfoFilled","icon-color":"red",title:"确定要删除该记录吗?",onConfirm:function(t){return D.onDeleteRemark(e.id)}},{reference:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{type:"danger",icon:D.Delete,circle:"",plain:"",size:"small"},null,8,["icon"])]})),_:2},1032,["onConfirm"])])),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]])])]})),default:Object(n["withCtx"])((function(){return[Object(n["createElementVNode"])("div",C,Object(n["toDisplayString"])(e.remark),1)]})),_:2},1024)]})),_:2},1024)]})),_:2},1024)})),128)),0==D.remarkData.pageData.content.length?(Object(n["openBlock"])(),Object(n["createBlock"])(R,{key:0},{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(y)]})),_:1})]})),_:1})):Object(n["createCommentVNode"])("",!0),Object(n["createVNode"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(L,{layout:"prev, pager, next","hide-on-single-page":!1,currentPage:D.remarkData.pageData.page,"page-size":D.remarkData.pageData.size,"page-count":D.remarkData.pageData.totalPages,onCurrentChange:D.onRemarkPageChange},null,8,["currentPage","page-size","page-count","onCurrentChange"])]})),_:1})]})),_:1}),Object(n["createVNode"])(q),Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(J,{modelValue:D.remarkData.formData.remark,"onUpdate:modelValue":t[1]||(t[1]=function(e){return D.remarkData.formData.remark=e}),rows:5,type:"textarea",placeholder:"请输入内容"},null,8,["modelValue"])]})),_:1})]})),_:1})),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]]),Object(n["createVNode"])(q),Object(n["withDirectives"])((Object(n["openBlock"])(),Object(n["createBlock"])(R,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(B,null,{default:Object(n["withCtx"])((function(){return[Object(n["createVNode"])(_,{onClick:D.onCreateRemark},{default:Object(n["withCtx"])((function(){return[k]})),_:1},8,["onClick"])]})),_:1})]})),_:1})),[[Z,["SYS_OWNER","GROUP_OWNER?groupId="+D.state.groupId,"GROUP_MEMBER?groupId="+D.state.groupId]]])]})),_:1},8,["modelValue"])]})),_:1})]})),_:1})]))}var x=a("1da1"),v=(a("d3b7"),a("159b"),a("96cf"),a("6c02")),_=a("1c1e"),y="/api/v1.0",E=function(e,t){return _["a"].get(y+"/projects/"+e+"/documents",{params:t})},B=function(e){return _["a"].post(y+"/projects/"+e+"/documents")},S=function(e,t){return _["a"].get(y+"/projects/"+e+"/document_versions",{params:t})},I=a("3ef4"),R=a("fc88"),P=a("53446"),T=a("0480"),F="/api/v1.0",z=function(e,t,a){return _["a"].delete(F+"/groups/"+e+"/projects/"+t+"/remarks/"+a)},U=function(e,t,a){return _["a"].post(F+"/groups/"+e+"/projects/"+t+"/remarks",a)},M=function(e,t,a){return _["a"].get(F+"/groups/"+e+"/projects/"+t+"/remarks",{params:a})},Y={setup:function(){var e=Object(v["c"])(),t=Object(n["reactive"])({databaseDocumentVersionFilter:{page:0,size:10},databaseDocumentVersions:[],databaseDocumentVersionTotalPages:0,databaseDocumentFilter:{version:null},databaseDocument:null,toc:[],init:!1,loadings:{handleSync:!1,loadingVersions:!1},projectId:null,groupId:null});t.projectId=e.params.projectId,t.groupId=e.params.groupId;var a=Object(n["computed"])((function(){return!t.databaseDocument&&t.init})),r=Object(n["computed"])((function(){return!t.databaseDocument&&!t.init})),c=function(e,t){Object(I["a"])({showClose:!0,message:t,type:e,duration:3e3})},o=function(){var a=Object(x["a"])(regeneratorRuntime.mark((function a(){var n,r;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return a.next=2,S(e.params.projectId);case 2:return n=a.sent,t.databaseDocumentVersions=n.data.content,t.databaseDocumentVersionTotalPages=n.data.totalPages,a.next=7,E(e.params.projectId);case 7:r=a.sent,r.errCode?c("error","同步失败:"+r.errMessage):r.data?(t.databaseDocument=r.data,l(r.data)):c("warn","无可用数据"),t.init=!0;case 10:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}(),l=function(e){var a=[];a.push({name:"overview",child:[]}),e.tables.forEach((function(e){var t=[];a.push({name:e.name,child:t})})),t.toc=a},i=function(e){var t=document.getElementById(e);if(t){var a=-100,n=t.offsetTop,r=t.offsetParent;while(null!==r)n+=r.offsetTop,r=r.offsetParent;window.scrollTo({top:n+a,behavior:"smooth"})}},u=function(e){return null==e.decimalDigits?e.type+"("+e.size+")":e.type+"("+e.size+", "+e.decimalDigits+")"},d=function(){var a=Object(x["a"])(regeneratorRuntime.mark((function a(){var n;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return t.loadings.loadingVersions=!0,a.next=3,E(e.params.projectId,t.databaseDocumentFilter);case 3:n=a.sent,n.data?(t.databaseDocument=n.data,l(n.data),c("success","切换成功")):c("warn","无可用数据"),t.loadings.loadingVersions=!1;case 6:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}(),b=function(){var a=e.params.projectId;t.loadings.handleSync=!0,B(a).then((function(e){e.errCode||(o(),c("success","同步成功")),t.loadings.handleSync=!1})).catch((function(){return t.loadings.handleSync=!1}))},s=j(Object(x["a"])(regeneratorRuntime.mark((function a(){var n;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:if(t.loadings.loadingVersions=!0,!(t.databaseDocumentVersionFilter.page+1<t.databaseDocumentVersionTotalPages)){a.next=8;break}return t.databaseDocumentVersionFilter.page++,a.next=5,S(e.params.projectId,t.databaseDocumentVersionFilter);case 5:n=a.sent,t.databaseDocumentVersionTotalPages=n.data.totalPages,n.data.content.length>0&&n.data.content.forEach((function(e){return t.databaseDocumentVersions.push(e)}));case 8:t.loadings.loadingVersions=!1;case 9:case"end":return a.stop()}}),a)}))),800);function j(e,t){var a=null;return function(){var n=this,r=arguments;a&&clearTimeout(a),a=setTimeout((function(){e.apply(n,r)}),t)}}o();var O=Object(n["reactive"])({isShowDrawer:!1,formData:{remark:null},pageFilter:{page:0,size:5,tableName:null,columnName:null},pageData:{content:[],page:0,size:10,totalPages:0}}),m=function(t,a){O.isShowDrawer=!0,O.pageFilter.tableName=t||null,O.pageFilter.columnName=a||null;var n=e.params.projectId,r=e.params.groupId;M(r,n,O.pageFilter).then((function(e){O.pageData=e.data,O.pageData.page=e.data.number+1}))},p=function(t){O.pageFilter.page=t-1;var a=e.params.projectId,n=e.params.groupId;M(n,a,O.pageFilter).then((function(e){O.pageData=e.data,O.pageData.page=e.data.number+1}))},f=function(){if(O.formData.remark&&""!=O.formData.remark){var t=e.params.projectId,a=e.params.groupId,n={tableName:O.pageFilter.tableName,columnName:O.pageFilter.columnName,remark:O.formData.remark};U(a,t,n).then((function(e){e.errCode||(O.formData.remark=null,c("success","提交成功"),p(1))}))}else c("warning","内容不能为空")},g=function(t){var a=e.params.projectId,n=e.params.groupId;z(n,a,t).then((function(e){e.errCode||(c("success","删除成功"),p(1))}))};return{Delete:R["a"],More:P["a"],Edit:T["a"],state:t,isShowNoDataPage:a,isShowLoadingPage:r,onClickToc:i,columnTypeFormat:u,loadMoreDocumentVersions:s,onProjectDocumentVersionChange:d,onSyncProjectDocument:b,remarkData:O,showRemarkDrawer:m,onRemarkPageChange:p,onCreateRemark:f,onDeleteRemark:g}}},G=(a("24b1"),a("6b0d")),W=a.n(G);const A=W()(Y,[["render",D]]);t["default"]=A},"0eab":function(e,t,a){},"24b1":function(e,t,a){"use strict";a("0eab")}}]);
+//# sourceMappingURL=chunk-4935816e.627c0115.js.map
\ No newline at end of file
diff --git a/api/src/main/resources/static/js/chunk-4935816e.627c0115.js.map b/api/src/main/resources/static/js/chunk-4935816e.627c0115.js.map
new file mode 100644
index 0000000..1b9ed2a
--- /dev/null
+++ b/api/src/main/resources/static/js/chunk-4935816e.627c0115.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///./src/views/Document.vue","webpack:///./src/api/Document.js","webpack:///./src/api/DocumentRemark.js","webpack:///./src/views/Document.vue?22f9","webpack:///./src/views/Document.vue?948f"],"names":["class","isShowNoDataPage","description","type","icon","round","size","onSyncProjectDocument","loading","state","loadings","handleSync","isShowLoadingPage","rows","init","gutter","span","style","groupId","onProjectDocumentVersionChange","databaseDocumentFilter","version","placeholder","clearable","databaseDocumentVersions","item","key","label","createAt","value","loadMoreDocumentVersions","loadingVersions","column","border","label-align","width","databaseDocument","databaseName","productName","productVersion","documentVersion","id","data","tables","prop","min-width","resizable","showRemarkDrawer","scope","row","name","Edit","tableMeta","columns","length","fit","formatter","columnTypeFormat","isPrimaryKey","nullable","autoIncrement","fixed","indexes","isUnique","triggers","toc","index","underline","onClickToc","child","childItem","childIndex","content","placement","bottom","remarkData","isShowDrawer","title","pageData","remark","shadow","header","remarkBy","nickname","confirm-button-text","cancel-button-text","icon-color","onDeleteRemark","reference","Delete","circle","plain","layout","hide-on-single-page","currentPage","page","page-size","page-count","totalPages","onRemarkPageChange","formData","onCreateRemark","base","getOneByProjectId","projectId","parameters","axios","get","params","syncByProjectId","post","getVersionByProjectId","deleteRemark","remarkId","delete","createRemark","body","listRemarks","setup","route","databaseDocumentVersionFilter","databaseDocumentVersionTotalPages","messageNotify","msg","showClose","message","duration","fetchDatabaseMetaData","versionResp","resp","errCode","errMessage","initTocByDocumentData","push","forEach","ele","document","getElementById","headerOffset","actualTop","offsetTop","current","offsetParent","window","scrollTo","top","behavior","decimalDigits","then","catch","debounce","element","fn","delay","timer","context","this","args","arguments","clearTimeout","setTimeout","apply","pageFilter","tableName","columnName","number","More","__exports__","render"],"mappings":"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","file":"js/chunk-4935816e.627c0115.js","sourcesContent":["<template>\n  <div v-if=\"isShowNoDataPage\">\n      <el-empty description=\"似乎还没有同步过文档\" >\n          <el-button type=\"primary\" icon='refresh' round size='large' @click=\"onSyncProjectDocument\" :loading=\"state.loadings.handleSync\">同步</el-button>\n      </el-empty>\n  </div>\n  <div v-else-if=\"isShowLoadingPage\">\n    <el-skeleton v-loading=\"!state.init\" :rows=\"12\" />\n  </div>\n  <div v-else>\n    <el-container class=\"document-container\">\n      <el-header>\n          <el-row :gutter=\"20\">\n            <el-col :span=\"2\" v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n              <el-button type=\"success\" style=\"width:100%\" icon=\"Refresh\" @click=\"onSyncProjectDocument\" :loading=\"state.loadings.handleSync\">同步</el-button>\n            </el-col>\n            <el-col :span=\"2\" v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n                <el-button type=\"primary\" style=\"width:100%\" icon=\"Download\">导出</el-button>\n            </el-col>\n            <el-col :span=\"4\">\n                <el-select @change=\"onProjectDocumentVersionChange\" v-model=\"state.databaseDocumentFilter.version\" placeholder=\"历史版本\" v-select-more=\"loadMoreDocumentVersions\" v-loading=\"state.loadings.loadingVersions\" clearable>\n                  <el-option\n                  v-for=\"item in state.databaseDocumentVersions\"\n                  :key=\"item.version\"\n                  :label=\"'['+item.createAt +']->'+item.version+''\"\n                  :value=\"item.version\"\n                  >\n                  </el-option>\n              </el-select>\n            </el-col>\n          </el-row>\n      </el-header>\n      \n      <el-main class=\"document-content-wrapper\">\n        \n        <div class=\"document-content\">\n        <el-row>\n          <!-- database overview -->\n          <el-col>\n            <el-descriptions :column=\"1\" size=\"large\" border>\n              <el-descriptions-item label=\"Database Name\" label-align=\"left\" width='200px'>{{ state.databaseDocument.databaseName }}</el-descriptions-item>\n              <el-descriptions-item label=\"Product Name\" label-align=\"left\">{{ state.databaseDocument.productName }}</el-descriptions-item>\n              <el-descriptions-item label=\"Product Version\" label-align=\"left\">{{ state.databaseDocument.productVersion }}</el-descriptions-item>\n              <el-descriptions-item label=\"Document Version\" label-align=\"left\">{{ state.databaseDocument.documentVersion }}</el-descriptions-item>\n              <el-descriptions-item label=\"Create At\" label-align=\"left\">{{ state.databaseDocument.createAt }}</el-descriptions-item>\n            </el-descriptions>\n          </el-col>\n        </el-row>\n\n        <!-- table overview -->\n        <el-row>\n          <el-col>\n            <h2 :id=\"state.databaseDocument.databaseName + '.overview'\">Overview</h2>\n          </el-col>\n        </el-row>\n        <el-row>\n          <el-col>\n            <el-table :data=\"state.databaseDocument.tables\"  border width='80%'>\n              <el-table-column type=\"index\" />\n              <el-table-column prop=\"name\" label=\"Name\" min-width=\"160\" resizable />\n              <el-table-column prop=\"type\" label=\"Type\" width=\"200\"  resizable />\n              <el-table-column prop=\"comment\" label=\"comment\" min-width=\"160\" resizable />\n              <el-table-column prop=\"remark\" label=\"remark\" min-width=\"160\" resizable >\n                <template v-slot=\"scope\">\n                    <el-button @click=\"showRemarkDrawer(scope.row.name)\" size=\"small\" :icon=\"Edit\"></el-button>\n                </template>\n              </el-table-column>\n            </el-table>\n          </el-col>\n        </el-row>\n\n        <!-- table details -->\n        <template v-for=\"tableMeta in state.databaseDocument.tables\" :key=\"tableMeta\">\n          <el-row>\n            <el-col>\n              <h2 :id=\"state.databaseDocument.databaseName + '.' + tableMeta.name\">{{ tableMeta.name }}</h2>\n            </el-col>\n          </el-row>\n          \n          <el-row>\n            <el-col v-if=\"tableMeta.columns.length > 0\">\n              <h3>Columns</h3>\n            </el-col>\n          </el-row>\n          <el-row>\n            <el-col >\n              <el-table :data=\"tableMeta.columns\" border fit width='80%'>\n                <el-table-column type=\"index\" />\n                <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\n                <el-table-column prop=\"type\" :formatter=\"columnTypeFormat\" label=\"Type\" width=\"140\" />\n                <el-table-column label=\"Primary Key\" width=\"120\"> \n                  <template v-slot=\"scope\">\n                    {{ scope.row.isPrimaryKey? 'YES':''}}\n                  </template>\n                </el-table-column>\n                <el-table-column prop=\"nullable\" label=\"Is Nullable\" width=\"120\">\n                   <template v-slot=\"scope\">\n                    {{ scope.row.nullable == 'YES' ? 'YES':''}}\n                  </template>\n                </el-table-column>\n                <el-table-column prop=\"autoIncrement\" label=\"Auto increment\" width=\"140\">\n                  <template v-slot=\"scope\">\n                    {{ scope.row.autoIncrement == 'YES'? 'YES':''}}\n                  </template>\n                </el-table-column>\n                <el-table-column prop=\"defaultValue\" label=\"default\" min-width=\"120\" />\n                <el-table-column prop=\"comment\" label=\"comment\"  />\n                <el-table-column prop=\"remark\" label=\"remark\" min-width=\"160\" resizable fixed=\"right\">\n                  <template v-slot=\"scope\">\n                      <el-button @click=\"showRemarkDrawer(tableMeta.name, scope.row.name)\" size=\"small\" :icon=\"Edit\"></el-button>\n                  </template>\n                </el-table-column>\n              </el-table>\n            </el-col>\n          </el-row>\n        \n          <div v-if=\"tableMeta.indexes.length > 0\">\n            <el-row>\n              <el-col>\n                <h3>Indexes</h3>            \n              </el-col>\n            </el-row>\n            <el-row>\n              <el-col >\n                <el-table :data=\"tableMeta.indexes\" border fit width='80%'>\n                  <el-table-column type=\"index\" />\n                  <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\n                  <el-table-column prop=\"isUnique\" label=\"Is Unique\" width=\"120\">\n                    <template v-slot=\"scope\">\n                      {{ scope.row.isUnique? 'YES':''}}\n                    </template>\n                  </el-table-column>\n                  <el-table-column prop=\"columnNames\" label=\"Columns\" min-width=\"150\" />\n                </el-table>\n              </el-col>\n            </el-row>\n          </div>\n          \n          <div  v-if=\"tableMeta.triggers.length > 0\">\n            <el-row>\n              <el-col>\n                <h3>Triggers</h3>\n              </el-col>\n            </el-row>\n            <el-row>\n              <el-col >\n                <el-table :data=\"tableMeta.triggers\" fit border width='80%'>\n                  <el-table-column type=\"index\" />\n                  <el-table-column prop=\"name\" label=\"Name\" min-width=\"120\" />\n                  <el-table-column prop=\"timing\" label=\"timing\" />\n                  <el-table-column prop=\"manipulation\" label=\"manipulation\" width=\"120\" />\n                  <el-table-column prop=\"statement\" label=\"statement\" />\n                  <el-table-column prop=\"creatAt\" label=\"creatAt\" width=\"150\" />\n                </el-table>\n              </el-col>\n            </el-row>\n          </div>\n\n        </template>\n        </div>\n        <div class=\"toc-wrapper\">\n          <div class=\"toc\">\n            <ul>\n              <li v-for=\"(item, index) in state.toc\" :key=\"index\">\n                <el-link :underline=\"false\" @click=\"onClickToc(state.databaseDocument.databaseName +'.'+ item.name)\">\n                  {{ item.name }}\n                </el-link>\n                <ul>\n                  <li v-for=\"(childItem, childIndex) in item.child\" :key=\"index+'-'+childIndex\"><el-link :underline=\"false\">{{ childItem.name }}</el-link></li>\n                </ul>\n              </li>\n            </ul>\n          </div>\n        </div>\n        <el-tooltip\n          content=\"回到顶部\"\n          placement=\"top\"\n        >\n          <el-backtop :bottom=\"100\"></el-backtop>\n        </el-tooltip>\n\n        <!-- remarks -->\n        <el-drawer\n          v-model=\"remarkData.isShowDrawer\"\n          title=\"更多\"\n          size=\"50%\"\n        >\n\n          <el-row v-for=\"(remark, index) in remarkData.pageData.content\" :key=\"index\">\n            <el-col>\n              <el-card shadow=\"never\" class=\"remark-card\"> \n                <template #header>\n                <div class=\"remark-header\">\n                  <span>\n                    <span class=\"remark-user\">{{remark.remarkBy.nickname}}</span>  \n                    <span class=\"remark-time\">{{remark.createAt}}</span>\n                  </span>\n                  <span v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n<el-popconfirm\n                    confirm-button-text=\"确定\"\n                    cancel-button-text=\"取消\"\n                    icon=\"InfoFilled\"\n                    icon-color=\"red\"\n                    title=\"确定要删除该记录吗?\"\n                    @confirm=\"onDeleteRemark(remark.id)\"\n                    \n                    >\n                      <template #reference>\n                        <el-button type=\"danger\" :icon=\"Delete\" circle plain size=\"small\"></el-button>\n                      </template>\n                    </el-popconfirm>\n                  </span>\n                    \n                  \n                </div>\n                </template>\n                  <div class=\"item text remark-content\">\n                    {{ remark.remark }}\n                  </div>\n              </el-card>\n            </el-col>\n          </el-row>\n          <el-row v-if=\"remarkData.pageData.content.length == 0\">\n            <el-col>\n              <el-empty></el-empty>\n            </el-col>\n          </el-row>\n\n          <el-row>\n            <el-col>\n              <el-pagination layout=\"prev, pager, next\" \n                :hide-on-single-page=\"false\"\n                :currentPage=\"remarkData.pageData.page\" \n                :page-size=\"remarkData.pageData.size\" \n                :page-count=\"remarkData.pageData.totalPages\"\n                @current-change=\"onRemarkPageChange\">\n              </el-pagination>\n            </el-col>\n          </el-row>\n          <el-divider></el-divider>\n          <el-row v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n            <el-col>\n              <el-input\n                v-model=\"remarkData.formData.remark\"\n                :rows=\"5\"\n                type=\"textarea\" \n                placeholder=\"请输入内容\"\n              />\n            </el-col>\n          </el-row>\n          <el-divider></el-divider>\n\n          <el-row v-require-roles=\"['SYS_OWNER', 'GROUP_OWNER?groupId='+state.groupId, 'GROUP_MEMBER?groupId='+state.groupId]\">\n            <el-col>\n              <el-button @click=\"onCreateRemark\">提交</el-button>\n            </el-col>\n          </el-row>\n        </el-drawer>\n      </el-main>\n    </el-container>\n  </div>\n</template>\n\n<style>\n\n.remark-card {\n  margin-bottom: 30px;\n}\n\n.remark-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.remark-header .remark-user {\n  color: rgb(109, 109, 109);\n}\n\n.remark-header .remark-time {\n  color: rgb(109, 109, 109);\n  font-size: 0.8rem;\n  margin-left: 10px;\n}\n\n\n.remark-content {\n  white-space: pre-wrap;\n  text-align: left;\n}\n\n.text {\n  font-size: 14px;\n  line-height: 1.3rem;\n}\n\n.item {\n  margin-top: 10px;\n  margin-right: 40px;\n}\n\n.toc-wrapper {\n  right:0;\n  top: 60;\n  z-index: 0;\n  bottom: auto;\n  padding-left: 33px;\n  margin-left: 10px;\n}\n\n.toc {\n  top: 130px;\n  position: fixed;\n  margin-left: 0;\n  transform: scale(1, 1);\n  bottom:0;\n  position:fixed;\n  overflow-y:hidden;\n  overflow-x:hidden;\n}\n\n.toc:hover {\n  overflow-y: auto;\n}\n\n.toc-wrapper .toc ul {\n    list-style: none;\n    line-height: 1.7;\n    inline-size: 200px;\n    overflow-wrap: break-word;\n}\n\n.toc-wrapper .toc a {\n    display: inherit;\n}\n\n.document-content-wrapper {\n  display: flex;\n  margin: 0;\n  min-width: 50rem;\n  max-width: 60rem;\n}\n\n.document-content {\n  min-width: 50rem;\n}\n\n\n</style>\n\n<script>\nimport { reactive, computed } from 'vue'\nimport {  useRoute } from 'vue-router'\nimport { getOneByProjectId, syncByProjectId, getVersionByProjectId } from '@/api/Document'\nimport { ElMessage } from 'element-plus'\nimport { Delete, More, Edit } from '@element-plus/icons'\nimport { listRemarks, createRemark, deleteRemark } from '@/api/DocumentRemark'\n\nexport default {\n  setup() {\n    const route = useRoute()\n    const state = reactive({\n      databaseDocumentVersionFilter: {\n        page: 0,\n        size: 10,\n      },\n      databaseDocumentVersions: [],\n      databaseDocumentVersionTotalPages: 0,\n      databaseDocumentFilter: {\n        version: null\n      },\n      databaseDocument: null,\n      toc: [],\n      init: false,\n      loadings: {\n        handleSync: false,\n        loadingVersions: false\n      },\n      projectId: null,\n      groupId: null\n    })\n\n    state.projectId = route.params.projectId\n    state.groupId = route.params.groupId\n    const isShowNoDataPage = computed(() => !state.databaseDocument && state.init)\n    const isShowLoadingPage = computed(() => !state.databaseDocument && !state.init)\n\n    const messageNotify = (type, msg) => {\n      ElMessage({\n            showClose: true,\n            message: msg,\n            type: type,\n            duration: 3 * 1000\n        });\n    }\n\n    const fetchDatabaseMetaData = async () => {\n      // fetch version\n      const versionResp = await getVersionByProjectId(route.params.projectId)\n      state.databaseDocumentVersions = versionResp.data.content\n      state.databaseDocumentVersionTotalPages = versionResp.data.totalPages\n\n      // fetch meta\n      const resp = await getOneByProjectId(route.params.projectId)\n      if (resp.errCode) {\n        messageNotify('error', '同步失败:'+resp.errMessage)\n      } else if (resp.data) {\n        state.databaseDocument = resp.data\n        initTocByDocumentData(resp.data)\n      } else {\n        messageNotify('warn', '无可用数据')\n      }\n      state.init = true\n    }\n\n    const initTocByDocumentData = (data) => {\n      const toc = []\n      toc.push({ name: 'overview', child: [] })\n      data.tables.forEach(item => {\n        const child = []\n        toc.push({ name: item.name, child: child })\n      })\n      state.toc = toc\n    }\n\n    const onClickToc = (id) => {\n      const ele = document.getElementById(id)\n      if (ele) {\n        var headerOffset = -100;\n        var actualTop = ele.offsetTop;\n        var current = ele.offsetParent;\n          while (current !== null){\n          actualTop += current.offsetTop;\n          current = current.offsetParent;\n        }\n        window.scrollTo({\n          top: actualTop + headerOffset,\n          behavior: \"smooth\"\n        })\n      }\n    }\n\n    const columnTypeFormat = (column) => {\n      if (column.decimalDigits == null) {\n        return column.type + '('+column.size+')' \n      } else {\n        return column.type + '('+column.size+', '+column.decimalDigits+')'\n      }\n    }\n\n    const onProjectDocumentVersionChange = async () => {\n      state.loadings.loadingVersions = true\n      const resp =  await getOneByProjectId(route.params.projectId, state.databaseDocumentFilter)\n      if (resp.data) {\n        state.databaseDocument = resp.data\n        initTocByDocumentData(resp.data)\n        messageNotify('success', '切换成功')\n      } else {\n        messageNotify('warn', '无可用数据')\n      }\n      state.loadings.loadingVersions = false\n    }\n\n    const onSyncProjectDocument = () => {\n      const projectId = route.params.projectId\n      state.loadings.handleSync = true\n      syncByProjectId(projectId)\n      .then(resp => {\n        if (!resp.errCode) {\n          fetchDatabaseMetaData()\n          messageNotify('success', '同步成功')\n        }\n        state.loadings.handleSync = false\n      })\n      .catch(() => state.loadings.handleSync = false)\n    }\n\n    const loadMoreDocumentVersions = debounce(async () => {\n        state.loadings.loadingVersions = true\n        if (state.databaseDocumentVersionFilter.page + 1  < state.databaseDocumentVersionTotalPages) {\n          state.databaseDocumentVersionFilter.page++\n          const versionResp = await  getVersionByProjectId(route.params.projectId, state.databaseDocumentVersionFilter)\n          state.databaseDocumentVersionTotalPages = versionResp.data.totalPages\n          if (versionResp.data.content.length > 0){\n            versionResp.data.content.forEach(element => state.databaseDocumentVersions.push(element))\n          }\n        }\n        state.loadings.loadingVersions = false\n    }, 800)\n\n    fetchDatabaseMetaData()\n\n    // 节流\n    function debounce(fn, delay) {\n      let timer = null\n      return function () {\n        let context = this\n        let args = arguments\n        if(timer) {\n            clearTimeout(timer)\n        }\n        timer = setTimeout(function () {\n          fn.apply(context, args)\n        }, delay)\n      }\n    }\n\n    // remarks\n    const remarkData = reactive({\n      isShowDrawer: false,\n      formData: {\n        remark: null,\n      },\n      pageFilter: {\n        page: 0,\n        size: 5,\n        tableName: null,\n        columnName: null\n      },\n      pageData: {\n        content: [],\n        page: 0,\n        size: 10,\n        totalPages: 0\n      },\n    })\n    const showRemarkDrawer = (tableName, columnName) => {\n      remarkData.isShowDrawer = true\n      if (tableName) {\n        remarkData.pageFilter.tableName = tableName\n      } else {\n        remarkData.pageFilter.tableName = null\n      }\n      if(columnName) {\n        remarkData.pageFilter.columnName = columnName\n      } else {\n        remarkData.pageFilter.columnName = null\n      }\n      const projectId = route.params.projectId\n      const groupId = route.params.groupId\n      listRemarks(groupId, projectId, remarkData.pageFilter).then(resp => {\n        remarkData.pageData = resp.data\n        remarkData.pageData.page = resp.data.number + 1\n      })\n    }\n\n    const onRemarkPageChange = (currentPage) => {\n      remarkData.pageFilter.page = currentPage - 1\n      const projectId = route.params.projectId\n      const groupId = route.params.groupId\n      listRemarks(groupId, projectId, remarkData.pageFilter).then(resp => {\n        remarkData.pageData = resp.data\n        remarkData.pageData.page = resp.data.number + 1\n      })\n    }\n\n    const onCreateRemark = () => {\n      if(!remarkData.formData.remark || remarkData.formData.remark == '') {\n        messageNotify('warning', '内容不能为空')\n        return\n      }\n      const projectId = route.params.projectId\n      const groupId = route.params.groupId\n      const body  = {\n        tableName: remarkData.pageFilter.tableName,\n        columnName: remarkData.pageFilter.columnName,\n        remark: remarkData.formData.remark\n      }\n      createRemark(groupId, projectId, body).then(resp => {\n        if(!resp.errCode) {\n          remarkData.formData.remark = null\n          messageNotify('success', '提交成功')\n          onRemarkPageChange(1)\n        }\n      })\n    }\n\n    const onDeleteRemark = (remarkId) => {\n      const projectId = route.params.projectId\n      const groupId = route.params.groupId\n      deleteRemark(groupId, projectId, remarkId).then(resp => {\n        if(!resp.errCode) {\n          messageNotify('success', '删除成功')\n          onRemarkPageChange(1)\n        }\n      })\n    }\n\n    return {\n      Delete,\n      More,\n      Edit,\n      state,\n      isShowNoDataPage,\n      isShowLoadingPage,\n      onClickToc,\n      columnTypeFormat,\n      loadMoreDocumentVersions,\n      onProjectDocumentVersionChange,\n      onSyncProjectDocument,\n      remarkData,\n      showRemarkDrawer,\n      onRemarkPageChange,\n      onCreateRemark,\n      onDeleteRemark\n    }\n  }\n}\n\n</script>","import axios from '@/utils/fetch';\n\nconst base = '/api/v1.0'\n\nexport const getOneByProjectId = (projectId, parameters) => {\n    return axios.get(base + '/projects/'+projectId+'/documents', {\n        params: parameters\n    })\n}\n\nexport const syncByProjectId = (projectId) => {\n    return axios.post(base + \"/projects/\"+projectId+\"/documents\")\n}\n\nexport const getVersionByProjectId =(projectId, parameters) => {\n    return axios.get(base + \"/projects/\"+projectId+\"/document_versions\", {\n        params: parameters\n    })\n}\n","import axios from '@/utils/fetch';\n\nconst base = '/api/v1.0'\n\nexport const deleteRemark = (groupId, projectId, remarkId) => {\n    return axios.delete(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks/'+remarkId)\n}\n\nexport const createRemark = (groupId, projectId, body) => {\n    return axios.post(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks', body)\n}\n\nexport const listRemarks = (groupId, projectId, parameters) => {\n    return axios.get(base + '/groups/' +groupId+'/projects/'+projectId+'/remarks', {\n        params: parameters\n    })\n}\n\n","import { render } from \"./Document.vue?vue&type=template&id=77474f01\"\nimport script from \"./Document.vue?vue&type=script&lang=js\"\nexport * from \"./Document.vue?vue&type=script&lang=js\"\n\nimport \"./Document.vue?vue&type=style&index=0&id=77474f01&lang=css\"\n\nimport exportComponent from \"/Users/vrtia/workspace/vran/databasir-frontend/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./Document.vue?vue&type=style&index=0&id=77474f01&lang=css\""],"sourceRoot":""}
\ No newline at end of file