From f84c0f2de793be5dac3bda0e952afe14c625f596 Mon Sep 17 00:00:00 2001 From: dongyukun <1208714201@qq.com> Date: 星期四, 26 六月 2025 16:35:28 +0800 Subject: [PATCH] ai模型绑定 --- src/views/ai/chat/index/components/role/RoleList.vue | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 174 insertions(+), 0 deletions(-) diff --git a/src/views/ai/chat/index/components/role/RoleList.vue b/src/views/ai/chat/index/components/role/RoleList.vue new file mode 100644 index 0000000..e0388d0 --- /dev/null +++ b/src/views/ai/chat/index/components/role/RoleList.vue @@ -0,0 +1,174 @@ +<template> + <div class="card-list" ref="tabsRef" @scroll="handleTabsScroll"> + <div class="card-item" v-for="role in roleList" :key="role.id"> + <el-card class="card" body-class="card-body"> + <!-- 更多操作 --> + <div class="more-container" v-if="showMore"> + <el-dropdown @command="handleMoreClick"> + <span class="el-dropdown-link"> + <el-button type="text"> + <el-icon><More /></el-icon> + </el-button> + </span> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item :command="['edit', role]"> + <Icon icon="ep:edit" color="#787878" />编辑 + </el-dropdown-item> + <el-dropdown-item :command="['delete', role]" style="color: red"> + <Icon icon="ep:delete" color="red" />删除 + </el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> + </div> + <!-- 角色信息 --> + <div> + <img class="avatar" :src="role.avatar" /> + </div> + <div class="right-container"> + <div class="content-container"> + <div class="title">{{ role.name }}</div> + <div class="description">{{ role.description }}</div> + </div> + <div class="btn-container"> + <el-button type="primary" size="small" @click="handleUseClick(role)">使用</el-button> + </div> + </div> + </el-card> + </div> + </div> +</template> + +<script setup lang="ts"> +import { ChatRoleVO } from '@/api/ai/model/chatRole' +import { PropType, ref } from 'vue' +import { More } from '@element-plus/icons-vue' + +const tabsRef = ref<any>() // tabs ref + +// 定义属性 +const props = defineProps({ + loading: { + type: Boolean, + required: true + }, + roleList: { + type: Array as PropType<ChatRoleVO[]>, + required: true + }, + showMore: { + type: Boolean, + required: false, + default: false + } +}) + +// 定义钩子 +const emits = defineEmits(['onDelete', 'onEdit', 'onUse', 'onPage']) + +/** 操作:编辑、删除 */ +const handleMoreClick = async (data) => { + const type = data[0] + const role = data[1] + if (type === 'delete') { + emits('onDelete', role) + } else { + emits('onEdit', role) + } +} + +/** 选中 */ +const handleUseClick = (role) => { + emits('onUse', role) +} + +/** 滚动 */ +const handleTabsScroll = async () => { + if (tabsRef.value) { + const { scrollTop, scrollHeight, clientHeight } = tabsRef.value + if (scrollTop + clientHeight >= scrollHeight - 20 && !props.loading) { + await emits('onPage') + } + } +} +</script> + +<style lang="scss"> +// 重写 card 组件 body 样式 +.card-body { + max-width: 240px; + width: 240px; + padding: 15px 15px 10px 15px; + + display: flex; + flex-direction: row; + justify-content: flex-start; + position: relative; +} +</style> +<style scoped lang="scss"> +// 卡片列表 +.card-list { + display: flex; + flex-direction: row; + flex-wrap: wrap; + position: relative; + height: 100%; + overflow: auto; + padding: 0px 25px; + padding-bottom: 140px; + align-items: start; + align-content: flex-start; + justify-content: start; + + .card { + display: inline-block; + margin-right: 20px; + border-radius: 10px; + margin-bottom: 20px; + position: relative; + + .more-container { + position: absolute; + top: 0; + right: 12px; + } + + .avatar { + width: 40px; + height: 40px; + border-radius: 10px; + overflow: hidden; + } + + .right-container { + margin-left: 10px; + width: 100%; + //height: 100px; + + .content-container { + height: 85px; + + .title { + font-size: 18px; + font-weight: bold; + color: #3e3e3e; + } + + .description { + margin-top: 10px; + font-size: 14px; + color: #6a6a6a; + } + } + + .btn-container { + display: flex; + flex-direction: row-reverse; + margin-top: 2px; + } + } + } +} +</style> -- Gitblit v1.9.3