From c1498006d64ac53630980aaa2aaf424300e9815c Mon Sep 17 00:00:00 2001
From: zhangxiao <898441624@qq.com>
Date: 星期一, 05 八月 2024 10:24:34 +0800
Subject: [PATCH] fix: 获取URL

---
 src/views/dmx/model/components/addKeyUrl.vue    |  161 +++++++
 src/views/dmx/model/components/addModel.vue     |  214 ++++----
 src/views/dmx/model/index.vue                   |  410 ++++++++++++++---
 src/components/upload/index.vue                 |   35 +
 package.json                                    |   10 
 src/views/dmx/model/components/addTableName.vue |  164 +++++++
 src/views/dmx/model/components/addPageModel.vue |  351 +++++++++++++++
 7 files changed, 1,162 insertions(+), 183 deletions(-)

diff --git a/package.json b/package.json
index 12aaa78..4236183 100644
--- a/package.json
+++ b/package.json
@@ -16,16 +16,14 @@
   },
   "lint-staged": {
     "*.{js,ts,jsx,tsx}": [
-      "prettier --write",
-      "eslint --fix"
+      "prettier --write"
+    
     ],
     "*.vue": [
-      "stylelint --fix",
-      "prettier --write",
-      "eslint --fix"
+      "prettier --write"
+     
     ],
     "*.{less,css}": [
-      "stylelint --fix",
       "prettier --write"
     ]
   },
diff --git a/src/components/upload/index.vue b/src/components/upload/index.vue
new file mode 100644
index 0000000..e0c517e
--- /dev/null
+++ b/src/components/upload/index.vue
@@ -0,0 +1,35 @@
+<template>
+  <a-upload
+    v-model:fileList="fileList"
+    list-type="picture-card"
+    :limit="limit"
+    :action="action"
+    @change="handleChange"
+    image-preview
+  />
+</template>
+
+<script setup>
+  import { ref } from 'vue';
+  const props = defineProps({
+    limit: {
+      type: Number,
+      default: 1,
+    },
+    action: String, // 涓婁紶鐨勬湇鍔″櫒鍦板潃
+  });
+
+  const emit = defineEmits(['update:fileList', 'success']);
+  const fileList = ref([]);
+
+  const handleChange = (fileList) => {
+    emit('update:fileList', fileList);
+    const successFiles = fileList.filter((item) => item.status === 'done');
+    if (successFiles.length > 0) {
+      emit(
+        'success',
+        successFiles.map((item) => item.response.data)
+      );
+    }
+  };
+</script>
diff --git a/src/views/dmx/model/components/addKeyUrl.vue b/src/views/dmx/model/components/addKeyUrl.vue
new file mode 100644
index 0000000..b1c4704
--- /dev/null
+++ b/src/views/dmx/model/components/addKeyUrl.vue
@@ -0,0 +1,161 @@
+<template>
+  <a-modal
+    v-model:visible="addTabVisible"
+    title="娣诲姞妯″紡"
+    @before-open="handleOpened"
+    @cancel="handleCancel"
+    :footer="false"
+    title-align="start"
+    width="600px"
+  >
+    <a-form
+      ref="formRef"
+      :rules="rules"
+      :model="form"
+      @submit="handleSubmit"
+      :style="{ width: '90%', margin: '0 auto' }"
+      layout="vertical"
+    >
+      <a-form-item field="name" label="妯″瀷鍚嶇О">
+        <a-input v-model="form.name" placeholder="璇疯緭鍏ユā鍨嬪悕绉�" />
+      </a-form-item>
+      <a-form-item field="describe" label="妯″瀷鎻忚堪">
+        <a-textarea placeholder="璇疯緭鍏ユā鍨嬫弿杩�" allow-clear />
+      </a-form-item>
+
+      <a-form-item field="section" label="妯″瀷鍥剧墖">
+        <a-space direction="vertical" :style="{ width: '100%' }">
+          <Upload
+            :limit="1"
+            @update:fileList="updateFileList"
+            :oploadUrl="uploadAction"
+            @success="handleChange"
+          ></Upload>
+        </a-space>
+      </a-form-item>
+      <a-form-item>
+        <div style="width: 100%; text-align: right">
+          <a-button @click="addTabVisible = false">鍙栨秷</a-button>
+          <a-button style="margin-left: 10px" type="primary" html-type="submit"
+            >纭畾</a-button
+          >
+        </div>
+      </a-form-item>
+    </a-form>
+  </a-modal>
+</template>
+
+<script lang="ts" setup>
+  import { onMounted, onBeforeMount, reactive, ref } from 'vue';
+
+  const addTabVisible = defineModel('tabShow');
+  const loading = ref(false);
+  const props = defineProps({
+    task_id: {
+      type: Number,
+      default: null,
+    },
+  });
+
+  const form = reactive({
+    size: 'medium',
+    name: '',
+    describe: '',
+    age: undefined,
+    section: '0',
+    province: 'haidian',
+    options: [],
+    date: '',
+    time: '',
+    radio: 'radio one',
+    slider: 5,
+    score: 5,
+    switch: false,
+    multiSelect: ['section one'],
+    treeSelect: '',
+    raptor: false,
+    prompt:
+      '璇锋�荤粨浠ヤ笅娈佃惤銆� 灏忓績鏁板瓧锛屼笉瑕佺紪閫犮�� 娈佃惤濡備笅锛歕n' +
+      '      {cluster_content}\n' +
+      '浠ヤ笂灏辨槸浣犻渶瑕佹�荤粨鐨勫唴瀹广��',
+  });
+  const formRef = ref(null);
+
+  const rules = {
+    name: [
+      {
+        required: true,
+        message: '鍚嶇О涓嶅厑璁镐负绌�',
+      },
+    ],
+    describe: [
+      {
+        required: true,
+        message: '鎻忚堪涓嶅厑璁镐负绌�',
+      },
+    ],
+  };
+
+  const handleSubmit = ({ values, errors }) => {
+    console.log('values:', values, '\nerrors:', errors);
+  };
+
+  const handleClick = () => {
+    addTabVisible.value = true;
+  };
+  const handleBeforeOk = (done) => {
+    formRef.value.validate().then((res) => {
+      console.log('form:', form);
+      if (!form.name) {
+        done(false);
+      } else {
+        console.log('璇锋眰鏁版嵁');
+      }
+    });
+  };
+  const handleCancel = () => {
+    addTabVisible.value = false;
+  };
+  //鍥剧墖涓婁紶
+  const fileList = ref([]);
+  const imageUrls = ref([]);
+  const uploadAction = ref('/api/v1/llm/upload');
+  const updateFileList = (newFileList) => {
+    fileList.value = newFileList;
+  };
+  const handleChange = (urls) => {
+    console.log(urls, 9999);
+  };
+
+  const handleOpened = (el) => {
+    Object.assign(form, {
+      name: '', // 鐢ㄦ埛鍚�
+      nameJoin: '', // 鏄电О
+      post: '', // 宀椾綅
+      txt: '', // 澶囨敞
+    });
+    formRef.value.resetFields();
+  };
+
+  const file = ref();
+
+  const onChange = (_, currentFile) => {
+    file.value = {
+      ...currentFile,
+      // url: URL.createObjectURL(currentFile.file),
+    };
+  };
+  const onProgress = (currentFile) => {
+    file.value = currentFile;
+  };
+
+  onBeforeMount(() => {});
+  onMounted(() => {});
+</script>
+
+<script lang="ts">
+  export default {
+    name: 'add',
+    methods: {},
+  };
+</script>
diff --git a/src/views/dmx/model/components/addModel.vue b/src/views/dmx/model/components/addModel.vue
index eeab066..35c9ce5 100644
--- a/src/views/dmx/model/components/addModel.vue
+++ b/src/views/dmx/model/components/addModel.vue
@@ -1,18 +1,26 @@
-
 <template>
   <a-button type="primary" @click="handleClick" style="margin-left: 10px">
     <template #icon>
       <icon-plus />
     </template>
   </a-button>
-  <a-modal v-model:visible="visible" title="娣诲姞妯″紡"
-           @before-open="handleOpened"
-           @cancel="handleCancel"
-           :footer="false"
-           title-align="start"
-           width="600px"
+  <a-modal
+    v-model:visible="visible"
+    title="娣诲姞妯″紡"
+    @before-open="handleOpened"
+    @cancel="handleCancel"
+    :footer="false"
+    title-align="start"
+    width="600px"
   >
-    <a-form ref="formRef" :rules="rules" :model="form" @submit="handleSubmit" :style="{width:'90%',margin:'0 auto'}" layout="vertical" >
+    <a-form
+      ref="formRef"
+      :rules="rules"
+      :model="form"
+      @submit="handleSubmit"
+      :style="{ width: '90%', margin: '0 auto' }"
+      layout="vertical"
+    >
       <a-form-item field="name" label="妯″瀷绫诲瀷">
         <a-select v-model="form.section" placeholder="璇烽�夋嫨">
           <a-option value="section one">Section One</a-option>
@@ -21,7 +29,7 @@
         </a-select>
       </a-form-item>
       <a-form-item field="name" label="妯″瀷鍚嶇О">
-        <a-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�"/>
+        <a-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
       </a-form-item>
       <a-form-item field="section" label="妯″瀷鍥剧墖">
         <a-space direction="vertical" :style="{ width: '100%' }">
@@ -35,8 +43,10 @@
             <template #upload-button>
               <div
                 :class="`arco-upload-list-item${
-            file && file.status === 'error' ? ' arco-upload-list-item-error' : ''
-          }`"
+                  file && file.status === 'error'
+                    ? ' arco-upload-list-item-error'
+                    : ''
+                }`"
               >
                 <div
                   class="arco-upload-list-picture custom-upload-avatar"
@@ -52,11 +62,11 @@
                     type="circle"
                     size="mini"
                     :style="{
-                position: 'absolute',
-                left: '50%',
-                top: '50%',
-                transform: 'translateX(-50%) translateY(-50%)',
-              }"
+                      position: 'absolute',
+                      left: '50%',
+                      top: '50%',
+                      transform: 'translateX(-50%) translateY(-50%)',
+                    }"
                   />
                 </div>
                 <div class="arco-upload-picture-card" v-else>
@@ -71,16 +81,18 @@
         </a-space>
       </a-form-item>
       <a-form-item field="name" label="鍩虹Url">
-        <a-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�"/>
+        <a-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
       </a-form-item>
       <a-form-item field="raptor" label="鏄惁鏀寔 Vision">
         <a-switch v-model="form.raptor" />
       </a-form-item>
 
       <a-form-item>
-        <div style="width: 100%;text-align: right">
+        <div style="width: 100%; text-align: right">
           <a-button @click="visible = false">鍙栨秷</a-button>
-          <a-button style="margin-left: 10px" type="primary" html-type="submit">纭畾</a-button>
+          <a-button style="margin-left: 10px" type="primary" html-type="submit"
+            >纭畾</a-button
+          >
         </div>
       </a-form-item>
     </a-form>
@@ -88,100 +100,92 @@
 </template>
 
 <script lang="ts" setup>
-import { onMounted ,onBeforeMount, reactive, ref } from "vue";
+  import { onMounted, onBeforeMount, reactive, ref } from 'vue';
 
-const visible = ref(false);
-const loading = ref(false);
-const form = reactive({
-  size: "medium",
-  name: "",
-  age: undefined,
-  section: "0",
-  province: "haidian",
-  options: [],
-  date: "",
-  time: "",
-  radio: "radio one",
-  slider: 5,
-  score: 5,
-  switch: false,
-  multiSelect: ["section one"],
-  treeSelect: "",
-  raptor: false,
-  prompt: '璇锋�荤粨浠ヤ笅娈佃惤銆� 灏忓績鏁板瓧锛屼笉瑕佺紪閫犮�� 娈佃惤濡備笅锛歕n' +
-    '      {cluster_content}\n' +
-    '浠ヤ笂灏辨槸浣犻渶瑕佹�荤粨鐨勫唴瀹广��',
-});
-const formRef = ref(null);
-
-const rules = {
-  name: [
-    {
-      required: true,
-      message:'鍚嶇О涓嶅厑璁镐负绌�',
-    },
-  ],
-}
-
-
-const handleSubmit = ({values, errors}) => {
-  console.log('values:', values, '\nerrors:', errors)
-}
-
-const handleClick = () => {
-  visible.value = true;
-};
-const handleBeforeOk = (done) => {
-    formRef.value.validate().then(res => {
-      console.log('form:', form)
-      if (!form.name) {
-        done(false)
-      }else {
-        console.log('璇锋眰鏁版嵁');
-
-      }
-    })
-};
-const handleCancel = () => {
-  visible.value = false;
-}
-
-const handleOpened =(el) => {
-  Object.assign(form,{
-    name: '',// 鐢ㄦ埛鍚�
-    nameJoin: '',// 鏄电О
-    post: '',// 宀椾綅
-    txt: '',// 澶囨敞
+  const visible = ref(false);
+  const loading = ref(false);
+  const form = reactive({
+    size: 'medium',
+    name: '',
+    age: undefined,
+    section: '0',
+    province: 'haidian',
+    options: [],
+    date: '',
+    time: '',
+    radio: 'radio one',
+    slider: 5,
+    score: 5,
+    switch: false,
+    multiSelect: ['section one'],
+    treeSelect: '',
+    raptor: false,
+    prompt:
+      '璇锋�荤粨浠ヤ笅娈佃惤銆� 灏忓績鏁板瓧锛屼笉瑕佺紪閫犮�� 娈佃惤濡備笅锛歕n' +
+      '      {cluster_content}\n' +
+      '浠ヤ笂灏辨槸浣犻渶瑕佹�荤粨鐨勫唴瀹广��',
   });
-  formRef.value.resetFields();
-}
+  const formRef = ref(null);
 
-const file = ref();
-
-const onChange = (_, currentFile) => {
-  file.value = {
-    ...currentFile,
-    // url: URL.createObjectURL(currentFile.file),
+  const rules = {
+    name: [
+      {
+        required: true,
+        message: '鍚嶇О涓嶅厑璁镐负绌�',
+      },
+    ],
   };
-};
-const onProgress = (currentFile) => {
-  file.value = currentFile;
-};
 
-onBeforeMount(()=>{
+  const handleSubmit = ({ values, errors }) => {
+    console.log('values:', values, '\nerrors:', errors);
+  };
 
-})
-onMounted(()=>{
+  const handleClick = () => {
+    visible.value = true;
+  };
+  const handleBeforeOk = (done) => {
+    formRef.value.validate().then((res) => {
+      console.log('form:', form);
+      if (!form.name) {
+        done(false);
+      } else {
+        console.log('璇锋眰鏁版嵁');
+      }
+    });
+  };
+  const handleCancel = () => {
+    visible.value = false;
+  };
 
+  const handleOpened = (el) => {
+    Object.assign(form, {
+      name: '', // 鐢ㄦ埛鍚�
+      nameJoin: '', // 鏄电О
+      post: '', // 宀椾綅
+      txt: '', // 澶囨敞
+    });
+    formRef.value.resetFields();
+  };
 
-})
+  const file = ref();
+
+  const onChange = (_, currentFile) => {
+    file.value = {
+      ...currentFile,
+      // url: URL.createObjectURL(currentFile.file),
+    };
+  };
+  const onProgress = (currentFile) => {
+    file.value = currentFile;
+  };
+
+  onBeforeMount(() => {});
+  onMounted(() => {});
 </script>
 
 <script lang="ts">
-export default {
-  name: 'add',
-  methods: {
-
-  }
-};
-</script>
\ No newline at end of file
+  export default {
+    name: 'add',
+    methods: {},
+  };
+</script>
diff --git a/src/views/dmx/model/components/addPageModel.vue b/src/views/dmx/model/components/addPageModel.vue
new file mode 100644
index 0000000..e0b0771
--- /dev/null
+++ b/src/views/dmx/model/components/addPageModel.vue
@@ -0,0 +1,351 @@
+<template>
+  <!-- 娣诲姞缂栬緫瀛愭ā鍨� -->
+  <a-modal
+    v-model:visible="addPageModelVisible"
+    :title="title"
+    @before-open="handleOpened"
+    @cancel="handleCancel"
+    :footer="false"
+    title-align="start"
+    width="600px"
+  >
+    <a-form
+      ref="form_ref"
+      :rules="rules"
+      :model="form"
+      @submit="handleSubmit"
+      :style="{ width: '90%', margin: '0 auto' }"
+      layout="vertical"
+    >
+      <div v-if="isType !== 1">
+        <a-form-item field="model_type" label="妯″瀷绫诲瀷">
+          <a-select v-model="form.model_type" placeholder="璇烽�夋嫨">
+            <a-option value="chat">chat</a-option>
+            <a-option value="embedding">embedding</a-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item field="llm_name" label="妯″瀷鍚嶇О">
+          <a-input v-model="form.llm_name" placeholder="璇疯緭鍏ユā鍨嬪悕绉�" />
+        </a-form-item>
+
+        <!-- <a-form-item field="volc_ak" label="鐏北 ACCESS_KEY">
+          <a-input v-model="form.volc_ak" placeholder="璇疯緭鍏ョ伀灞� ACCESS_KEY" />
+          <a-button
+            type="primary"
+            @click="handleClick"
+            style="margin-left: 10px"
+          >
+            <template #icon>
+              <icon-plus />
+            </template>
+          </a-button>
+        </a-form-item>
+        <a-form-item field="volc_sk" label="鐏北 SECRET_KEY">
+          <a-input v-model="form.volc_sk" placeholder="璇疯緭鍏ョ伀灞� SECRET_KEY" />
+        </a-form-item> -->
+        <a-form-item field="api_base" label="鍩虹URL">
+          <a-input v-model="form.api_base" placeholder="璇疯緭鍏ュ熀纭�URL" />
+        </a-form-item>
+
+        <a-form-item
+          field="raptor"
+          label="鏄惁鏀寔 Vision"
+          v-if="form.model_type === 'chat'"
+        >
+          <a-switch v-model="form.raptor" />
+        </a-form-item>
+        <a-form-item field="logo" label="妯″瀷鍥剧墖">
+          <a-space direction="vertical" :style="{ width: '100%' }">
+            <Upload
+              :action="uploadAction"
+              :limit="1"
+              @update:fileList="updateFileList"
+              @success="handleSuccess"
+            ></Upload>
+          </a-space>
+        </a-form-item>
+        <a-form-item field="all_params" label="澧炲姞鍏跺畠鍙傛暟閰嶇疆">
+          <a-button
+            type="primary"
+            @click="handleAddClick"
+            style="margin-left: 10px"
+          >
+            <template #icon>
+              <icon-plus />
+            </template>
+          </a-button>
+        </a-form-item>
+
+        <a-form-item v-for="(item, index) in form.addFomList" :key="index">
+          <div class="addInput">
+            <a-input
+              style="width: 230px"
+              v-model="item.name"
+              placeholder="璇疯緭鍏ey"
+            />
+            锛�
+            <a-input v-model="item.value" placeholder="璇疯緭鍏alue" />
+
+            <a-button
+              status="danger"
+              @click="handleDelInput(index)"
+              style="margin-left: 10px"
+            >
+              <template #icon>
+                <icon-minus size="22" />
+              </template>
+            </a-button>
+          </div>
+        </a-form-item>
+      </div>
+      <div v-else>
+        <a-form-item field="name" label="API-Key">
+          <a-input v-model="form.name" placeholder="API-Key" />
+        </a-form-item>
+        <a-form-item field="describe" label="Base-Url">
+          <a-input v-model="form.name" placeholder="Base-Url" />
+        </a-form-item>
+
+        <a-form-item field="section" label="妯″瀷鍥剧墖">
+          <a-space direction="vertical" :style="{ width: '100%' }">
+            <Upload
+              :action="uploadAction"
+              :limit="1"
+              @update:fileList="updateFileList"
+              @success="handleSuccess"
+            ></Upload>
+          </a-space>
+        </a-form-item>
+      </div>
+
+      <a-form-item>
+        <div style="width: 100%; text-align: right">
+          <a-button @click="addPageModelVisible = false">鍙栨秷</a-button>
+          <a-button style="margin-left: 10px" type="primary" html-type="submit"
+            >纭畾</a-button
+          >
+        </div>
+      </a-form-item>
+    </a-form>
+  </a-modal>
+</template>
+
+<script lang="ts" setup>
+  import { reactive, ref, computed, watch } from 'vue';
+  import { addLlm, getLlmDetail } from '@/api/model';
+  import { Modal, Message } from '@arco-design/web-vue';
+  import message from '@arco-design/web-vue/es/message';
+  import { resolveUnref } from '@vueuse/core';
+
+  const addPageModelVisible = defineModel('show');
+  const loading = ref(false);
+  const props = defineProps({
+    task_id: {
+      type: Number,
+      default: null,
+    },
+    type: {
+      type: Number,
+      default: 0,
+    },
+    title: {
+      type: String,
+      default: '',
+    },
+    editList: {
+      type: Object,
+      default: {},
+    },
+  });
+
+  const isType = computed(() => props.type);
+  const editList = computed(() => props.editList);
+
+  watch(
+    () => editList.value.name,
+    (newValue) => {
+      getDetail();
+    }
+  );
+
+  const form = reactive({
+    size: 'medium',
+    name: '',
+    llm_factory: '',
+    model_type: '',
+    province: 'haidian',
+    options: [],
+    llm_name: '',
+    api_base: '',
+    volc_ak: '',
+    volc_sk: '',
+    logo: '',
+    radio: 'radio one',
+    slider: 5,
+    score: 5,
+    switch: false,
+    multiSelect: ['section one'],
+    treeSelect: '',
+    raptor: false,
+    addFomList: [],
+  });
+  const form_ref = ref(null);
+
+  const rules = {
+    model_type: [
+      {
+        required: true,
+        message: '璇烽�夋嫨妯″瀷绫诲瀷',
+      },
+    ],
+    llm_name: [
+      {
+        required: true,
+        message: '鍚嶇О涓嶅厑璁镐负绌�',
+      },
+    ],
+    volc_sk: [
+      {
+        required: true,
+        message: '璇疯緭鍏olc_sk',
+      },
+    ],
+    volc_ak: [
+      {
+        required: true,
+        message: '璇疯緭鍏olc_ak',
+      },
+    ],
+    api_base: [
+      {
+        required: true,
+        message: '璇疯緭鍏pi_base',
+      },
+    ],
+  };
+
+  const uploadAction = '/api/v1/llm/upload'; // 鏇挎崲涓轰綘鐨勪笂浼燗PI
+  const fileList = ref([]);
+  const imageUrls = ref([]);
+
+  const updateFileList = (newFileList) => {
+    fileList.value = newFileList;
+    console.log(newFileList, 88);
+  };
+
+  const handleSuccess = (urls) => {
+    imageUrls.value = urls; // 鎷垮埌涓婁紶鐨勫浘鐗囧湴鍧�
+  };
+  const emit = defineEmits(['refresh-parent']);
+  const handleSubmit = ({ values, errors }) => {
+    const all_params = form.addFomList.map((item) => {
+      console.log(item, 8888);
+      return item.name + ':' + item.value;
+    });
+    form_ref.value
+      ?.validate()
+      .then(async (res) => {
+        if (!res) {
+          const data = await addLlm({
+            llm_factory: editList.value.llm_factory,
+            llm_name: form.llm_name,
+            model_type: form.model_type,
+            volc_ak: form.volc_ak,
+            volc_sk: form.volc_sk,
+            api_base: form.api_base,
+            raptor: form.raptor,
+            all_params: all_params,
+            logo: imageUrls.value[0],
+          });
+          if ((data as any).retmsg == 'success') {
+            message.success('娣诲姞鎴愬姛');
+            emit('refresh-parent');
+          } else {
+            message.error('娣诲姞澶辫触');
+          }
+        }
+      })
+      .catch((err) => {
+        console.log(err);
+      });
+  };
+
+  //   const addPageModelVisible = ref(false);
+  const handleAddPageModel = () => {
+    addPageModelVisible.value = true;
+  };
+
+  const handleClick = () => {
+    addPageModelVisible.value = true;
+  };
+  const handleBeforeOk = (done) => {
+    form_ref.value?.validate().then((res) => {
+      console.log('form:', form);
+      if (!form.name) {
+        done(false);
+      } else {
+        console.log('璇锋眰鏁版嵁');
+      }
+    });
+  };
+
+  //澧炲姞鍏朵粬鍙傛暟
+  const handleAddClick = () => {
+    form.addFomList.push({ name: '', value: '' });
+  };
+
+  //鍑忓皯鍏朵粬鍙傛暟
+  const handleDelInput = (index) => {
+    form.addFomList.splice(index, 1);
+  };
+  const handleCancel = () => {
+    addPageModelVisible.value = false;
+  };
+
+  const handleOpened = (el) => {
+    Object.assign(form, {
+      name: '', // 鐢ㄦ埛鍚�
+      nameJoin: '', // 鏄电О
+      post: '', // 宀椾綅
+      txt: '', // 澶囨敞
+    });
+    form_ref.value?.resetFields();
+  };
+
+  const file = ref();
+
+  const onChange = (_, currentFile) => {
+    file.value = {
+      ...currentFile,
+      // url: URL.createObjectURL(currentFile.file),
+    };
+  };
+  const onProgress = (currentFile) => {
+    file.value = currentFile;
+  };
+
+  //鑾峰彇璇︽儏
+  const getDetail = async () => {
+    const data = await getLlmDetail(
+      editList.value.llm_factory,
+      editList.value.name
+    );
+    console.log(data.data, 8888);
+    form.llm_name = data.data.llm_name;
+    form.model_type = data.data.model_type;
+    form.volc_ak = data.data.volc_ak;
+    form.volc_sk = data.data.volc_sk;
+    form.api_base = data.data.api_base;
+    form.raptor = data.data.raptor;
+    form.addFomList = data.data.all_params.map((item) => {
+      return { name: item.split(':')[0], value: item.split(':')[1] };
+    });
+    imageUrls.value = data.data.logo;
+  };
+</script>
+<style scoped lang="less">
+  .addInput {
+    display: flex;
+    width: 100%;
+  }
+</style>
diff --git a/src/views/dmx/model/components/addTableName.vue b/src/views/dmx/model/components/addTableName.vue
new file mode 100644
index 0000000..a6b5631
--- /dev/null
+++ b/src/views/dmx/model/components/addTableName.vue
@@ -0,0 +1,164 @@
+<template>
+  <!-- 娣诲姞妯″瀷 -->
+  <a-modal
+    v-model:visible="addTabVisible"
+    title="娣诲姞妯″紡"
+    @before-open="handleOpened"
+    @cancel="handleCancel"
+    :footer="false"
+    title-align="start"
+    width="600px"
+  >
+    <a-form
+      ref="formRef"
+      :rules="rules"
+      :model="form"
+      @submit="handleSubmit"
+      :style="{ width: '90%', margin: '0 auto' }"
+      layout="vertical"
+    >
+      <a-form-item field="name" label="妯″瀷鍚嶇О">
+        <a-input v-model="form.name" placeholder="璇疯緭鍏ユā鍨嬪悕绉�" />
+      </a-form-item>
+      <a-form-item field="apiKey" label="API-Key">
+        <a-input v-model="form.apiKey" placeholder="API-Key" />
+      </a-form-item>
+      <a-form-item field="baseUrl" label="Base-Url">
+        <a-input v-model="form.baseUrl" placeholder="Base-Url" />
+      </a-form-item>
+      <a-form-item field="tags" label="妯″瀷鎻忚堪">
+        <a-textarea
+          v-model="form.tags"
+          placeholder="璇疯緭鍏ユā鍨嬫弿杩�"
+          allow-clear
+        />
+      </a-form-item>
+
+      <a-form-item field="section" label="妯″瀷鍥剧墖">
+        <a-space direction="vertical" :style="{ width: '100%' }">
+          <Upload
+            :action="uploadAction"
+            :limit="1"
+            @update:fileList="updateFileList"
+            @success="handleSuccess"
+          ></Upload>
+        </a-space>
+      </a-form-item>
+      <a-form-item>
+        <div style="width: 100%; text-align: right">
+          <a-button @click="addTabVisible = false">鍙栨秷</a-button>
+          <a-button style="margin-left: 10px" type="primary" html-type="submit"
+            >纭畾</a-button
+          >
+        </div>
+      </a-form-item>
+    </a-form>
+  </a-modal>
+</template>
+
+<script lang="ts" setup>
+  import { onMounted, onBeforeMount, reactive, ref, computed } from 'vue';
+  import { addLlmFactory } from '@/api/model';
+  import { Message } from '@arco-design/web-vue';
+
+  const addTabVisible = defineModel('tabShow');
+  const loading = ref(false);
+  const props = defineProps({
+    task_id: {
+      type: Number,
+      default: null,
+    },
+    nameList: {
+      type: Object,
+      default: {},
+    },
+  });
+  const editList = computed(() => props.nameList);
+
+  const form = reactive({
+    size: 'medium',
+    name: '',
+    describe: '',
+    api_base: '',
+    tags: '',
+    logo: '',
+  });
+  const formRef = ref(null);
+
+  const rules = {
+    name: [
+      {
+        required: true,
+        message: '鍚嶇О涓嶅厑璁镐负绌�',
+      },
+    ],
+    describe: [
+      {
+        required: true,
+        message: '鎻忚堪涓嶅厑璁镐负绌�',
+      },
+    ],
+  };
+
+  const handleSubmit = ({ values, errors }) => {
+    console.log(editList, 9999);
+    formRef.value.validate().then(async (res) => {
+      if (!res) {
+        await addLlmFactory({
+          name: form.name,
+          tags: form.tags,
+          api_base: form.api_base,
+          // all_params: all_params,
+          logo: imageUrls.value[0],
+        })
+          .then((resData) => {
+            if ((resData as any).code === 200) {
+              emit('refresh-parent');
+              addTabVisible.value = false;
+              Message.success('娣诲姞鎴愬姛');
+            }
+          })
+          .catch(() => {
+            Message.error('娣诲姞澶辫触');
+          });
+      }
+    });
+  };
+  const emit = defineEmits(['refresh-parent']);
+  const handleClick = () => {
+    addTabVisible.value = true;
+  };
+
+  const handleCancel = () => {
+    addTabVisible.value = false;
+  };
+  //鍥剧墖涓婁紶
+  const uploadAction = '/api/v1/llm/upload'; // 鏇挎崲涓轰綘鐨勪笂浼燗PI
+  const fileList = ref([]);
+  const imageUrls = ref([]);
+  const updateFileList = (newFileList) => {
+    fileList.value = newFileList;
+  };
+
+  const handleSuccess = (urls) => {
+    imageUrls.value = urls; // 鎷垮埌涓婁紶鐨勫浘鐗囧湴鍧�
+    console.log(urls, 77777);
+  };
+
+  const handleOpened = (el) => {
+    Object.assign(form, {
+      name: '', // 鐢ㄦ埛鍚�
+      nameJoin: '', // 鏄电О
+      post: '', // 宀椾綅
+      txt: '', // 澶囨敞
+    });
+    formRef.value?.resetFields();
+  };
+</script>
+
+<script lang="ts">
+  export default {
+    name: 'add',
+    methods: {},
+  };
+</script>
diff --git a/src/views/dmx/model/index.vue b/src/views/dmx/model/index.vue
index 7965e45..0a55621 100644
--- a/src/views/dmx/model/index.vue
+++ b/src/views/dmx/model/index.vue
@@ -1,126 +1,291 @@
 <template>
   <div class="container">
     <Breadcrumb :items="['澶фā鍨�', '澶фā鍨嬬鐞�']" />
+
     <a-row :gutter="20" align="stretch">
       <a-col :span="24">
-        <a-card class="general-card" :title="$t('澶фā鍨嬬鐞�')">
+        <a-card
+          class="general-card"
+          style="min-height: 130px"
+          :title="$t('澶фā鍨嬬鐞�')"
+        >
           <a-row justify="space-between">
-            <a-col :span="24">
+            <a-col :span="24" class="table_add_clore" v-if="loading">
               <a-tabs
-                :active-key="activeKey"
+                :default-active-key="tabKey"
                 type="line"
                 :editable="true"
                 @tab-click="changeTabs"
                 @add="handleAdd"
                 @delete="handleDelete"
+                show-add-button
+                auto-switch
               >
                 <a-tab-pane
-                  v-for="(item, index) of data"
-                  :key="item.key"
-                  :title="item.title"
-                  :closable="index >= 4"
+                  v-for="(item, index) in tabData"
+                  :key="index"
+                  :title="index"
+                  :closable="Object.keys(tabData).length >= 4"
                 >
-                  <div style="display: flex; flex-wrap: wrap;justify-content: space-between;">
-                    <div class="card-wrap"    v-for="(item, index) of data" :key="index">
-                      <a-card :bordered="false" hoverable >
-                        <template #cover>
-                          <div
-                          >
-                            <img
-                              :style="{ width: '100%', transform: 'translateY(-20px)' }"
-                              alt="dessert"
-                              src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a20012a2d4d5b9db43dfc6a01fe508c0.png~tplv-uwbnlip3yd-webp.webp"
-                            />
-                          </div>
-                        </template>
-                        <div class="arco-card-body-content">
-                          <div class="arco-card-body-content-title">
-                            {{ item.title }}
-                          </div>
+                  <div
+                    style="display: flex; flex-wrap: wrap"
+                    class="card_content"
+                  >
+                    <div class="card-wrap">
+                      <div class="card_wrap_box">
+                        <div class="card_wrap_box_img">
+                          <img
+                            :style="{
+                              width: '100%',
+                            }"
+                            alt="dessert"
+                            :src="item.logo"
+                          />
                         </div>
-                        <div style="position: absolute; bottom: 1rem; right: 1rem;">
-                          <a-space>
-                            <a-button>
-                              鍒犻櫎
-                            </a-button>
-                            <editModel></editModel>
-                          </a-space>
+                        <a-card :bordered="false" hoverable>
+                          <div class="arco-card-body-content">
+                            <div
+                              class="arco-card-body-content-title"
+                              style="word-wrap: break-word"
+                            >
+                              {{ item.tags }}
+                            </div>
+                            <!-- <div class="arco-card-body-content-dec">{{
+                            list.type
+                          }}</div> -->
+                          </div>
+                          <div class="arco-btn-group">
+                            <a-space class="btn-group">
+                              <!-- <editModel></editModel> -->
+                              <a-button type="primary" @click="handleEditModel">
+                                缂栬緫
+                              </a-button>
+                            </a-space>
+                          </div>
+                        </a-card>
+                      </div>
+                    </div>
+                    <div
+                      class="card-wrap"
+                      v-for="(list, index) of item.llm"
+                      :key="index"
+                    >
+                      <div class="card_wrap_box">
+                        <div>
+                          <img
+                            :style="{
+                              width: '100%',
+                              transform: 'translateY(-20px)',
+                            }"
+                            alt="dessert"
+                            :src="list.logo"
+                          />
+                          <!--   src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/a20012a2d4d5b9db43dfc6a01fe508c0.png~tplv-uwbnlip3yd-webp.webp" -->
                         </div>
-                      </a-card>
+                        <a-card :bordered="false" hoverable>
+                          <div class="arco-card-body-content">
+                            <div class="arco-card-body-content-title">
+                              {{ list.name }}
+                            </div>
+                            <div class="arco-card-body-content-dec">{{
+                              list.type
+                            }}</div>
+                          </div>
+                          <div class="arco-btn-group">
+                            <a-space class="btn-group">
+                              <a-button @click="handleDeleteModel(list)">
+                                鍒犻櫎
+                              </a-button>
+                              <a-button
+                                type="primary"
+                                @click="handleEditModel(list)"
+                              >
+                                缂栬緫
+                              </a-button>
+
+                              <!-- <editModel></editModel> -->
+                            </a-space>
+                          </div>
+                        </a-card>
+                      </div>
                     </div>
                   </div>
                 </a-tab-pane>
               </a-tabs>
             </a-col>
             <div> </div>
-            <a-input-search
-              :placeholder="$t('cardList.searchInput.placeholder')"
-              style="width: 240px; position: absolute; top: 60px; right: 60px"
-            />
-            <div style="position: absolute; top: 60px; right: 20px">
-              <addModel></addModel>
+            <div class="box_right">
+              <div class="search_input">
+                <a-input-search
+                  :placeholder="$t('cardList.searchInput.placeholder')"
+                  style="width: 240px"
+                />
+              </div>
+              <div>
+                <!-- <addModel></addModel> -->
+                <a-button
+                  type="primary"
+                  :loading="loading2"
+                  @click="handleAddModel"
+                >
+                  <template #icon>
+                    <icon-plus />
+                  </template>
+                  娣诲姞
+                </a-button>
+              </div>
             </div>
-
           </a-row>
         </a-card>
       </a-col>
     </a-row>
   </div>
+  <!-- 娣诲姞妯″瀷 -->
+  <addPageModel
+    v-model:show="show"
+    :task_id="task_id"
+    :type="modelType"
+    :title="title"
+    :editList="editList"
+    @refresh-parent="refreshParentMethod"
+    v-if="show"
+  ></addPageModel>
+  <!-- 娣诲姞tab妯″紡 -->
+  <addTableName
+    v-model:tabShow="tabShow"
+    :nameList="editList"
+    @refresh-parent="refreshParentMethod"
+    v-if="tabShow"
+  ></addTableName>
 </template>
 
 <script lang="ts" setup>
   import { ref, reactive, nextTick } from 'vue';
-
-  import QualityInspection from './components/quality-inspection.vue';
-  import TheService from './components/the-service.vue';
-  import RulesPreset from './components/rules-preset.vue';
-  import CustomSettings from './components/custom-settings.vue';
-  import addModel from "@/views/dmx/model/components/addModel.vue";
-  import editModel from "@/views/dmx/model/components/editModel.vue";
+  import addModel from '@/views/dmx/model/components/addModel.vue';
+  import editModel from '@/views/dmx/model/components/editModel.vue';
+  import addPageModel from './components/addPageModel.vue';
+  import addTableName from './components/addTableName.vue';
+  import {
+    modelList,
+    modelmyLlms,
+    deleteLlm,
+    deleteLlmFactory,
+  } from '@/api/model';
+  import { Modal, Message } from '@arco-design/web-vue';
 
   let count = 5;
   const activeKey = ref(1);
   const data = ref([
     {
       key: 1,
-      title: '鍏ㄩ儴',
+      title: 'key',
       content: 'Content of Tab Panel 1',
     },
     {
       key: 2,
-      title: '鍐呭璐ㄦ',
+      title: 'Ollama',
       content: 'Content of Tab Panel 2',
     },
     {
       key: 3,
-      title: '寮�閫氭湇鍔�',
+      title: 'Xinference',
       content: 'Content of Tab Panel 3',
     },
-    {
-      key: 4,
-      title: '瑙勫垯棰勭疆',
-      content: 'Content of Tab Panel 4',
-    },
   ]);
-const changeTabs = (val) => {
-  activeKey.value = val;
-}
-  const handleAdd = () => {
-    visible.value = true;
+  const tabData = ref({
+    key: {
+      tags: '娣诲姞key',
+      id: 1,
+    },
+  });
+
+  const isDeleteDialogVisible = ref(false); //鍒犻櫎鎻愰啋
+  const apiUrl = ref('http://127.0.0.1:5173');
+  // const httpUrl = import.meta.env.VITE_API_BASE_URL;
+  // console.log(apiUrl.value, 777);
+  const modalList = ref({});
+  const tabKey = ref('key');
+  const changeTabs = (val) => {
+    tabKey.value = val;
   };
-  const handleDelete = (key: any) => {
-    data.value = data.value.filter((item) => item.key !== key);
+  const show = ref(false);
+  const tabShow = ref(false);
+  const title = ref('娣诲姞妯″紡');
+  const task_id = ref(1);
+  const modelType = ref(1);
+  const handleAdd = () => {
+    tabShow.value = true;
+    editList.value.llm_factory = tabKey.value;
+  };
+  const editList = ref({ llm_factory: '' });
+  //澧炲姞妯″瀷瀛愮被
+  const handleAddModel = () => {
+    if (tabKey.value == 'key') {
+      tabShow.value = true;
+    } else {
+      modelType.value = 2;
+      editList.value.llm_factory = tabKey.value;
+      show.value = true;
+      title.value = '娣诲姞妯″紡';
+    }
+  };
+  //缂栬緫妯″瀷瀛愮被
+  const handleEditModel = (val) => {
+    if (tabKey.value == 'key') {
+      tabShow.value = true;
+    } else {
+      modelType.value = 2;
+      task_id.value = val.id;
+      show.value = true;
+      title.value = '缂栬緫';
+      editList.value = val;
+      editList.value.llm_factory = tabKey.value;
+    }
+  };
+
+  //鍒犻櫎妯″瀷
+  const handleDeleteModel = (val) => {
+    Modal.confirm({
+      title: '璀﹀憡',
+      content: '纭鍒犻櫎鍚�',
+      okText: '纭畾',
+      cancelText: '鍙栨秷',
+      onOk: async () => {
+        const factory = tabKey.value;
+        const res = await deleteLlm({
+          llm_factory: tabKey.value,
+          llm_name: val.name,
+        });
+
+        if ((res as any).code == 0) {
+          queryModel();
+          tabKey.value = factory;
+        } else {
+        }
+      },
+      onCancel: () => {},
+    });
+  };
+
+  //鐖剁骇妯″瀷
+  const handleDelete = async (key: any) => {
+    console.log(key, 45455);
+    // tabData.value = tabData.value.filter((item) => item.key !== key);
+    Reflect.deleteProperty(tabData.value, key);
+    await deleteLlmFactory(key);
+    queryModel();
   };
 
   const visible = ref(false);
   const formRef = ref(null);
+
   const form = reactive({
     size: 'medium',
     name: '',
   });
   const handleOk = () => {
     count += 1;
-    formRef.value.validate().then((res) => {
+    formRef.value?.validate().then((res) => {
       if (res) {
         return;
       }
@@ -134,19 +299,33 @@
     });
     nextTick(() => {
       visible.value = true;
-
-    })
+    });
     return false;
   };
-  const handleCancel = () => {
-    formRef.value.resetFields();
-    visible.value = false;
+  // const handleCancel = () => {
+  //   formRef.value.resetFields();
+  //   visible.value = false;
+  // };
+  // const handleSubmit = ({ values, errors }) => {
+  //   this.$refs.formRef.validate().then((res, a, b) => {
+  //     debugger;
+  //     console.log('values', values);
+  //   });
+  // };
+
+  //鑾峰彇妯″瀷鍒楄〃
+  const loading = ref(false);
+  const queryModel = async () => {
+    const res = await modelmyLlms();
+    modalList.value = res.data;
+    loading.value = true;
+    tabData.value = Object.assign({}, tabData.value, res.data);
   };
-  const handleSubmit = ({ values, errors }) => {
-    this.$refs.formRef.validate().then((res, a, b) => {
-      debugger;
-      console.log('values', values);
-    });
+  queryModel();
+
+  const refreshParentMethod = () => {
+    queryModel();
+    // 杩欓噷鎵ц闇�瑕佺殑鎿嶄綔
   };
 </script>
 
@@ -199,6 +378,93 @@
       }
     }
   }
+  .table_add_clore {
+    :deep(.arco-tabs-nav-add-btn .arco-icon-hover::before) {
+      top: 50%;
+      left: 50%;
+      width: 20px;
+      height: 20px;
+      transform: translate(-50%, -50%);
+      border-radius: 0;
+      background-color: #165dff;
+    }
+
+    :deep(.arco-tabs-nav-add-btn .arco-icon-hover .arco-icon) {
+      color: #fff;
+    }
+    :deep(.arco-tabs-nav) {
+      max-width: 60%;
+    }
+
+    :deep(.arco-icon-hover::before) {
+      top: 50%;
+      left: 50%;
+      width: 20px;
+      height: 20px;
+      transform: translate(-50%, -50%);
+      // border-radius: 0;
+      // background-color: #eee;
+    }
+    :deep(.arco-tabs-tab-close-btn .arco-icon) {
+      color: #666;
+    }
+  }
+  .box_right {
+    position: absolute;
+    top: 60px;
+    right: 20px;
+    display: flex;
+    .search_input {
+      margin-right: 10px;
+    }
+  }
+  .arco-card-body-content {
+    .arco-card-body-content-title {
+      font-size: 16px;
+      color: #333;
+      margin-bottom: 10px;
+      font-weight: 400;
+    }
+  }
+  .card_content {
+    position: relative;
+    .arco-btn-group {
+      position: absolute;
+      right: 10px;
+      top: 100px;
+    }
+    .card_wrap_box_img {
+      min-height: 200px;
+      max-height: 240px;
+    }
+  }
+
+  .card-wrap {
+    width: 320px;
+    height: 350px;
+    margin: 30px;
+    transition: all 0.3s;
+    border: 1px solid var(--color-neutral-3);
+    border-radius: 4px;
+    position: relative;
+    &:hover {
+      transform: translateY(-4px);
+      // box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.1);
+    }
+  }
+  .card-wrap {
+    width: 320px;
+    height: 350px;
+    margin: 30px;
+    transition: all 0.3s;
+    border: 1px solid var(--color-neutral-3);
+    border-radius: 4px;
+    position: relative;
+    &:hover {
+      transform: translateY(-4px);
+      // box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.1);
+    }
+  }
   .card-wrap {
     width: 320px;
     height: 350px;

--
Gitblit v1.8.0