Ver código fonte

Merge branch 'master' of http://git.izouma.com/xiongzhu/chat-admin

wangqifan 2 anos atrás
pai
commit
bd5599d2d6

BIN
public/favicon.ico


+ 8 - 0
src/components/PagingTable.vue

@@ -36,6 +36,11 @@ const props = defineProps({
     order: {
     order: {
         type: Object,
         type: Object,
         default: () => ({ createdAt: 'DESC' })
         default: () => ({ createdAt: 'DESC' })
+    },
+    //冻结
+    freeze: {
+        type: Boolean,
+        default: false
     }
     }
 })
 })
 const search = computed(() => {
 const search = computed(() => {
@@ -68,6 +73,9 @@ const pageConfig = useStorage('pageConfig', {
 const total = ref(0)
 const total = ref(0)
 const loading = ref(false)
 const loading = ref(false)
 async function getData() {
 async function getData() {
+    if (props.freeze) {
+        return
+    }
     try {
     try {
         loading.value = true
         loading.value = true
         const res = await http.post(props.url, {
         const res = await http.post(props.url, {

+ 9 - 1
src/router/index.js

@@ -99,7 +99,15 @@ const router = createRouter({
                     name: 'apiUser',
                     name: 'apiUser',
                     component: () => import('../views/ApiUserView.vue'),
                     component: () => import('../views/ApiUserView.vue'),
                     meta: {
                     meta: {
-                        title: '公司信息'
+                        title: '企业列表'
+                    }
+                },
+                {
+                    path: 'apiUserEdit',
+                    name: 'apiUserEdit',
+                    component: () => import('../views/ApiUserEditView.vue'),
+                    meta: {
+                        title: '企业信息'
                     }
                     }
                 },
                 },
                 {
                 {

+ 181 - 0
src/views/ApiUserEditView.vue

@@ -0,0 +1,181 @@
+<template>
+    <div class="max-w-[700px]">
+        <el-form :model="model" label-width="150px" :rules="rules">
+            <ElFormItem prop="name" label="名称">
+                <ElInput class="!w-[179px]" v-model="model.name" placeholder="请输入名称" />
+            </ElFormItem>
+            <ElFormItem prop="logo" label="logo">
+                <!-- <img v-if="model.logo" :src="model.logo" class="avatar" />
+                <i v-else class="el-icon-plus avatar-uploader-icon"></i> -->
+                <ElUpload
+                    class="avatar-uploader"
+                    action="https://gpt.izouma.com/api/file/upload"
+                    :show-file-list="false"
+                    :on-success="handleSuccess"
+                    :before-upload="beforeUpload"
+                >
+                    <img v-if="model.logo" :src="model.logo" class="avatar" />
+                    <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
+                </ElUpload>
+            </ElFormItem>
+            <ElFormItem prop="company" label="公司名称(助手名称)">
+                <ElInput class="!w-[179px]" v-model="model.company" placeholder="请输入公司名称" />
+            </ElFormItem>
+            <ElFormItem prop="desc" label="描述">
+                <ElInput v-model="model.desc" type="textarea" autosize placeholder="请输入描述" />
+            </ElFormItem>
+            <ElFormItem prop="code" label="apiCode">
+                <ElInput class="!w-[300px]" v-model="model.code" placeholder="apiCode" />
+            </ElFormItem>
+            <el-form-item label="">
+                <div class="w-full">
+                    <el-upload
+                        class="upload-demo"
+                        action
+                        drag
+                        v-model:file-list="fileList"
+                        :http-request="uploadFile"
+                        accept="application/pdf"
+                        :on-success="onSuccess"
+                    >
+                        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+                        <div class="el-upload__text">将文件拖入框内或点击此处上传</div>
+                    </el-upload>
+                </div>
+            </el-form-item>
+            <el-form-item label="">
+                <el-button type="primary" size="default" @click="submit">保存</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script setup>
+import { ref } from 'vue'
+import PagingTable from '@/components/PagingTable.vue'
+import { useTimeFormatter } from '@/utils/formatter'
+// import { Plus } from '@vicons/tabler'
+import EditDialog from '@/components/EditDialog.vue'
+import { setupEditDialog } from '@/utils/editDialog'
+import EnumSelect from '@/components/EnumSelect.vue'
+import { UserRole } from '@/enums'
+import { http } from '@/plugins/http'
+import { ElMessage } from 'element-plus'
+import { useClipboard } from '@vueuse/core'
+import { Plus, UploadFilled } from '@element-plus/icons-vue'
+
+const fileList = []
+const where = ref({})
+const timeFormatter = useTimeFormatter()
+const model = ref({})
+http.get(`/auth/admin/getRole`).then((res) => {
+    if (res === 'api') {
+        http.get('/admin/users/get').then((res) => {
+            where.value = { userId: res.id }
+            getData()
+        })
+    }
+})
+function getData() {
+    http.post('/apiUser', {
+        page: {
+            page: 1,
+            limit: 1
+        },
+        search: {
+            where: where.value
+        }
+    }).then((res) => {
+        if (res.items.length > 0) {
+            model.value = res.items[0]
+        }
+    })
+}
+const { showEditDialog, onEdit } = setupEditDialog(model)
+function uploadFile(file) {
+    if (!model.value.code) {
+        let formDatas = new FormData()
+        formDatas.append('file', file.file)
+        formDatas.append('code', model.value.code)
+        http.post(`/chat-pdf/upload`, formDatas).then((res) => {
+            console.log(res, file)
+            model.value.code = res.name
+        })
+    } else {
+        let formDatas = new FormData()
+        formDatas.append('file', file.file)
+        formDatas.append('code', model.value.code)
+        http.post(`/chat-pdf/upload/` + model.value.code, formDatas).then((res) => {
+            console.log(res, file)
+            model.value.code = res.name
+        })
+    }
+}
+function onSuccess(res, file) {
+    console.log(res, file)
+    model.value.code = res.name
+}
+async function submit() {
+    await http.put('/apiUser/' + model.value.id, model.value)
+    ElMessage.success('保存成功')
+    getData()
+}
+function getToken(row) {
+    http.get(`/auth/admin/user/${row.id}/token`).then((res) => {
+        const { copy } = useClipboard({ legacy: true })
+        copy(res.access_token)
+        ElMessage.success('复制成功')
+    })
+}
+function handleSuccess(response, file, fileList) {
+    model.value.logo = response.url
+    const input = document.querySelector('.el-upload__input')
+    input.value = ''
+    const preview = document.querySelector('.avatar')
+    preview.src = response.url
+}
+function beforeUpload(file) {
+    const isJPG = file.type === 'image/jpeg'
+    const isPNG = file.type === 'image/png'
+    if (!isJPG && !isPNG) {
+        this.$message.error('上传头像图片只能是 JPG 或 PNG 格式!')
+        return false
+    }
+    const isLt2M = file.size / 1024 / 1024 < 2
+    if (!isLt2M) {
+        this.$message.error('上传头像图片大小不能超过 2MB!')
+        return false
+    }
+    return true
+}
+</script>
+
+<style lang="less" scoped>
+.avatar-uploader .avatar {
+    width: 178px;
+    height: 178px;
+    display: block;
+}
+
+.el-icon.avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 178px;
+    height: 178px;
+    text-align: center;
+}
+
+:deep(.avatar-uploader) {
+    .el-upload {
+        border: 1px dashed var(--el-border-color);
+        border-radius: 6px;
+        cursor: pointer;
+        position: relative;
+        overflow: hidden;
+        transition: var(--el-transition-duration-fast);
+    }
+
+    .el-upload:hover {
+        border-color: var(--el-color-primary);
+    }
+}
+</style>

+ 33 - 18
src/views/MainView.vue

@@ -55,7 +55,7 @@ import SideMenu from '@/components/SideMenu.vue'
 import { useRoute } from 'vue-router'
 import { useRoute } from 'vue-router'
 import { ref, watch, shallowRef, inject } from 'vue'
 import { ref, watch, shallowRef, inject } from 'vue'
 import LogoSvg from '@/components/LogoSvg.vue'
 import LogoSvg from '@/components/LogoSvg.vue'
-import { User, MoodSmile, Wallet, Home, ExternalLink, Menu2, Settings } from '@vicons/tabler'
+import { User, MoodSmile, Wallet, Home, ExternalLink, Menu2, Settings, Users, License,Database } from '@vicons/tabler'
 import UserAvatar from '@/components/UserAvatar.vue'
 import UserAvatar from '@/components/UserAvatar.vue'
 import ChangePwd from '@/components/ChangePwd.vue'
 import ChangePwd from '@/components/ChangePwd.vue'
 import { http } from '@/plugins/http'
 import { http } from '@/plugins/http'
@@ -157,24 +157,39 @@ http.get(`/auth/admin/getRole`).then((res) => {
                 title: '主页',
                 title: '主页',
                 icon: shallowRef(Home)
                 icon: shallowRef(Home)
             },
             },
+            // {
+            //     name: 'user-parent',
+            //     title: 'api管理',
+            //     icon: shallowRef(User),
+            //     children: [
+            //         {
+            //             name: 'user',
+            //             title: '席位管理'
+            //         },
+            //         {
+            //             name: 'apiUser',
+            //             title: '用户信息'
+            //         },
+            //         {
+            //             name: 'usageDetail',
+            //             title: '用量统计'
+            //         }
+            //     ]
+            // },
             {
             {
-                name: 'user-parent',
-                title: 'api管理',
-                icon: shallowRef(User),
-                children: [
-                    {
-                        name: 'user',
-                        title: '席位管理'
-                    },
-                    {
-                        name: 'apiUser',
-                        title: '用户信息'
-                    },
-                    {
-                        name: 'usageDetail',
-                        title: '用量统计'
-                    }
-                ]
+                name: 'apiUserEdit',
+                title: '企业信息',
+                icon: shallowRef(License)
+            },
+            {
+                name: 'user',
+                title: '席位管理',
+                icon: shallowRef(Users)
+            },
+            {
+                name: 'usageDetail',
+                title: '用量统计',
+                icon: shallowRef(Database)
             }
             }
         ]
         ]
     }
     }

+ 12 - 2
src/views/UserView.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-    <PagingTable url="/admin/users" :where="where" ref="table">
+    <PagingTable url="/admin/users" :freeze="freeze" :where="where" ref="table">
         <template #filter>
         <template #filter>
             <EnumSelect :enum="UserRole" v-model="where.roles" v-if="role === 'admin'"></EnumSelect>
             <EnumSelect :enum="UserRole" v-model="where.roles" v-if="role === 'admin'"></EnumSelect>
             <ElButton :icon="Plus" @click="onEdit()">添加</ElButton>
             <ElButton :icon="Plus" @click="onEdit()">添加</ElButton>
@@ -35,7 +35,7 @@
     </EditDialog>
     </EditDialog>
 </template>
 </template>
 <script setup>
 <script setup>
-import { ref } from 'vue'
+import { nextTick, ref } from 'vue'
 import PagingTable from '@/components/PagingTable.vue'
 import PagingTable from '@/components/PagingTable.vue'
 import { useTimeFormatter } from '@/utils/formatter'
 import { useTimeFormatter } from '@/utils/formatter'
 import { Plus } from '@vicons/tabler'
 import { Plus } from '@vicons/tabler'
@@ -52,11 +52,21 @@ const timeFormatter = useTimeFormatter()
 const table = ref(null)
 const table = ref(null)
 const model = ref({})
 const model = ref({})
 let role = 'admin'
 let role = 'admin'
+const freeze = ref(true)
 http.get(`/auth/admin/getRole`).then((res) => {
 http.get(`/auth/admin/getRole`).then((res) => {
     if (res === 'api') {
     if (res === 'api') {
         http.get('/admin/users/get').then((res) => {
         http.get('/admin/users/get').then((res) => {
             where.value = { apiUserId: res.apiUserId, roles: 'api' }
             where.value = { apiUserId: res.apiUserId, roles: 'api' }
             role = 'api'
             role = 'api'
+            freeze.value = false
+            nextTick(() => {
+                table.value.refresh()
+            })
+        })
+    } else {
+        freeze.value = false
+        nextTick(() => {
+            table.value.refresh()
         })
         })
     }
     }
 })
 })