可信代码库-AI大模型收藏对话功能开发

This commit is contained in:
付民康
2025-05-30 11:02:36 +08:00
parent a1b3be6f6a
commit bd06998ac5

View File

@@ -55,9 +55,23 @@
<d-tooltip content="分享"> <d-tooltip content="分享">
<d-icon style="font-size: 14px;margin-right: 2px" @click.stop="handleShare(item)" name="icon-redo-new"></d-icon> <d-icon style="font-size: 14px;margin-right: 2px" @click.stop="handleShare(item)" name="icon-redo-new"></d-icon>
</d-tooltip> </d-tooltip>
<d-tooltip content="更多"> <d-dropdown style="width: 100px;" align="start">
<d-icon style="font-size: 14px;" @click.stop="handleMore(item)" name="icon-more-operate"></d-icon> <d-icon style="font-size: 14px;" @click.stop="handleMore(item)" name="icon-more-operate"></d-icon>
</d-tooltip> <template #menu>
<ul class="list-menu">
<li class="menu-item" @click="toggleCollect(item)">
<d-icon
:name="item.is_collected ? 'icon-star' : 'icon-star-o'"
style="font-size: 14px;padding-right: 4px"
/>
{{ item.is_collected ? '取消收藏' : '加入收藏' }}
</li>
<li class="menu-item" @click="handleDelete(item)">
<d-icon name="icon-delete" style="font-size: 14px;padding-right: 4px" />删除
</li>
</ul>
</template>
</d-dropdown>
</div> </div>
</template> </template>
</div> </div>
@@ -76,35 +90,6 @@
<NoData v-else :small="false"></NoData> <NoData v-else :small="false"></NoData>
</div> </div>
</d-collapse-item> </d-collapse-item>
<!-- <d-collapse-item name="yestoday">-->
<!-- <template #title>-->
<!-- <div class="jyh-collapse-title">-->
<!-- <d-icon style="margin-right: 4px" name="icon-delay"></d-icon>昨天-->
<!-- </div>-->
<!-- </template>-->
<!-- <div>-->
<!-- <div-->
<!-- v-for="(item, index) in cardList"-->
<!-- :key="index"-->
<!-- class="mb-3 jyh-collapse-card"-->
<!-- >-->
<!-- &lt;!&ndash; 卡片标题 &ndash;&gt;-->
<!-- <div class="card-header">-->
<!-- <h4>{{ item.title }}</h4>-->
<!-- </div>-->
<!-- &lt;!&ndash; 卡片内容 &ndash;&gt;-->
<!-- <div class="card-content">-->
<!-- <div class="content-left">-->
<!-- <img width="16" style="margin-right: 4px" src="@/assets/imgs/jyh/ai/aiLogo2.png" />-->
<!-- <span>{{ item.text }}</span>-->
<!-- </div>-->
<!-- <div class="content-right">-->
<!-- <span class="time-text">{{ formatTime(item.time) }}</span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </d-collapse-item>-->
</d-collapse> </d-collapse>
</div> </div>
<!-- 固定在底部的控制栏 --> <!-- 固定在底部的控制栏 -->
@@ -138,85 +123,88 @@
<d-search icon-position="left" style="width: 100%" placeholder="请输入搜索软件名称" v-model="searchText" @change="handleSearch"></d-search> <d-search icon-position="left" style="width: 100%" placeholder="请输入搜索软件名称" v-model="searchText" @change="handleSearch"></d-search>
<!-- 可滚动内容区域 --> <!-- 可滚动内容区域 -->
<div class="scrollable-content"> <div class="scrollable-content">
<!-- <d-collapse class="jyh-collapse" v-model="collapseValue">--> <d-collapse class="jyh-collapse" v-model="collapseValue">
<!-- <d-collapse-item name="today">--> <d-collapse-item name="today">
<!-- <template #title>--> <template #title>
<!-- <div class="jyh-collapse-title">--> <div class="jyh-collapse-title">
<!-- <d-icon style="margin-right: 4px" name="icon-delay"></d-icon>今天--> <d-icon style="margin-right: 4px" name="icon-delay"></d-icon>今天
<!-- </div>--> </div>
<!-- </template>--> </template>
<!-- <div>--> <div>
<!-- &lt;!&ndash; 循环生成卡片列表 &ndash;&gt;--> <!-- 循环生成卡片列表 -->
<!-- <div v-if="cardList.length>0">--> <div v-if="collectionList.length>0">
<!-- <div--> <div
<!-- v-for="(item, index) in cardList"--> v-for="(item, index) in collectionList"
<!-- :key="index"--> :key="index"
<!-- :class="['mb-3 jyh-collapse-card', { 'selected-card': selectedIndex === item.id }]"--> :class="['mb-3 jyh-collapse-card', { 'selected-card': props.CONV_ID === item.conversationId }]"
<!-- @click="selectCard(item)"--> @click="handleSelect(item)"
<!-- @mouseenter="hoverIndex = index"--> @mouseenter="hoverIndex = index"
<!-- @mouseleave="hoverIndex = null"--> @mouseleave="hoverIndex = null"
<!-- >--> >
<!-- &lt;!&ndash; 卡片标题 &ndash;&gt;--> <!-- 卡片标题 -->
<!-- <div class="card-header">--> <div class="card-header">
<!-- <h4>{{ item.title }}</h4>--> <!-- 编辑状态切换 -->
<!-- &lt;!&ndash; 悬停操作按钮 &ndash;&gt;--> <template v-if="item.isEditing">
<!-- <div class="card-actions" v-show="hoverIndex === index">--> <!-- <d-input v-model="item.tempTitle" @blur="cancelEdit(item)" @keypress.enter="confirmEdit(item)" autofocus class="edit-input" />-->
<!-- <d-tooltip content="编辑">--> <d-input v-model="item.tempTitle" autofocus class="edit-input" />
<!-- <d-icon style="font-size: 14px;margin-right: 2px" @click.stop="handleEdit(item)" name="icon-edit-3"></d-icon>--> <div class="card-actions">
<!-- </d-tooltip>--> <d-icon
<!-- <d-tooltip content="分享">--> name="icon-right"
<!-- <d-icon style="font-size: 14px;margin-right: 2px" @click.stop="handleShare(item)" name="icon-redo-new"></d-icon>--> style="font-size: 14px;"
<!-- </d-tooltip>--> @click="confirmEdit(item)"
<!-- <d-tooltip content="更多">--> />
<!-- <d-icon style="font-size: 14px;" @click.stop="handleMore(item)" name="icon-more-operate"></d-icon>--> <d-icon
<!-- </d-tooltip>--> name="icon-error"
<!-- </div>--> style="font-size: 14px;"
<!-- </div>--> @click="cancelEdit(item)"
<!-- &lt;!&ndash; 卡片内容 &ndash;&gt;--> />
<!-- <div class="card-content">--> </div>
<!-- <div class="content-left">--> </template>
<!-- <img width="16" style="margin-right: 4px" src="@/assets/imgs/jyh/ai/aiLogo2.png" />--> <template v-else>
<!-- <span>{{ item.text }}</span>--> <h4 @dblclick="startEdit(item)">{{ item.title }}</h4>
<!-- </div>--> <div class="card-actions" v-show="hoverIndex === index">
<!-- <div class="content-right">--> <d-tooltip content="编辑">
<!-- <span class="time-text">{{ formatTime(item.time) }}</span>--> <d-icon
<!-- </div>--> style="font-size: 14px; margin-right: 2px;"
<!-- </div>--> @click.stop="startEdit(item)"
<!-- </div>--> name="icon-edit-3"
<!-- </div>--> />
<!-- <NoData v-else :small="false"></NoData>--> </d-tooltip>
<!-- </div>--> <d-tooltip content="分享">
<!-- </d-collapse-item>--> <d-icon style="font-size: 14px;margin-right: 2px" @click.stop="handleShare(item)" name="icon-redo-new"></d-icon>
<!-- <d-collapse-item name="yestoday">--> </d-tooltip>
<!-- <template #title>--> <d-dropdown style="width: 100px;" align="start">
<!-- <div class="jyh-collapse-title">--> <d-icon style="font-size: 14px;" @click.stop="handleMore(item)" name="icon-more-operate"></d-icon>
<!-- <d-icon style="margin-right: 4px" name="icon-delay"></d-icon>昨天--> <template #menu>
<!-- </div>--> <ul class="list-menu">
<!-- </template>--> <li class="menu-item" @click="toggleCollect(item)">
<!-- <div>--> <d-icon name="icon-star" style="font-size: 14px;padding-right: 4px" />取消收藏
<!-- <div--> </li>
<!-- v-for="(item, index) in cardList"--> <li class="menu-item" @click="handleDelete(item)">
<!-- :key="index"--> <d-icon name="icon-delete" style="font-size: 14px;padding-right: 4px" />删除
<!-- class="mb-3 jyh-collapse-card"--> </li>
<!-- >--> </ul>
<!-- &lt;!&ndash; 卡片标题 &ndash;&gt;--> </template>
<!-- <div class="card-header">--> </d-dropdown>
<!-- <h4>{{ item.title }}</h4>--> </div>
<!-- </div>--> </template>
<!-- &lt;!&ndash; 卡片内容 &ndash;&gt;--> </div>
<!-- <div class="card-content">--> <!-- 卡片内容 -->
<!-- <div class="content-left">--> <div class="card-content">
<!-- <img width="16" style="margin-right: 4px" src="@/assets/imgs/jyh/ai/aiLogo2.png" />--> <div class="content-left">
<!-- <span>{{ item.text }}</span>--> <img width="16" style="margin-right: 4px" src="@/assets/imgs/jyh/ai/aiLogo2.png" />
<!-- </div>--> <span>{{ item.text || '可信代码库AI' }}</span>
<!-- <div class="content-right">--> </div>
<!-- <span class="time-text">{{ formatTime(item.time) }}</span>--> <div class="content-right">
<!-- </div>--> <span class="time-text">{{ item.createTime||'--' }}</span>
<!-- </div>--> </div>
<!-- </div>--> </div>
<!-- </div>--> </div>
<!-- </d-collapse-item>--> </div>
<!-- </d-collapse>--> <NoData v-else :small="false"></NoData>
</div>
</d-collapse-item>
</d-collapse>
</div> </div>
<!-- 固定在底部的控制栏 --> <!-- 固定在底部的控制栏 -->
<div class="bottom-control-bar"> <div class="bottom-control-bar">
@@ -234,15 +222,15 @@
<d-option value="0">0</d-option> <d-option value="0">0</d-option>
</d-select> </d-select>
</div> </div>
<!-- <div class="control-right">--> <!-- <div class="control-right">-->
<!-- <d-button class="jyh-button2" variant="solid" @click="openBatchManageModal">--> <!-- <d-button class="jyh-button2" variant="solid" @click="openBatchManageModal">-->
<!-- <template #icon>--> <!-- <template #icon>-->
<!-- <d-icon name="icon-property-setting"></d-icon>--> <!-- <d-icon name="icon-property-setting"></d-icon>-->
<!-- </template>--> <!-- </template>-->
<!-- 批量管理--> <!-- 批量管理-->
<!-- </d-button>--> <!-- </d-button>-->
<!-- <BatchManageModal ref="BatchManageModalRef"/>--> <!-- <BatchManageModal ref="BatchManageModalRef"/>-->
<!-- </div>--> <!-- </div>-->
</div> </div>
</d-tab> </d-tab>
</d-tabs> </d-tabs>
@@ -302,7 +290,6 @@ const startEdit = (item) => {
// 确认编辑 // 确认编辑
const confirmEdit = async (item) => { const confirmEdit = async (item) => {
debugger
if (!item.tempTitle.trim()) { if (!item.tempTitle.trim()) {
Message.error('标题不能为空'); Message.error('标题不能为空');
return; return;
@@ -328,9 +315,38 @@ const confirmEdit = async (item) => {
} }
}; };
// 收藏状态切换
const toggleCollect = async (item) => {
if (!props.username) {
return Message.error('请先登录');
}
try {
const res = await axios.post(`${VITE_AI_API_HOST}/api/toggleConversationCollect`, {
userId: props.username,
conversationId: item.conversationId
});
if (res.data.code === 20000) {
// 更新历史对话状态
item.is_collected = res.data.isCollected;
// 刷新收藏列表
await getQuestionCollection();
Message.success(res.data.message);
} else {
Message.error(res.data.message || '操作失败');
}
} catch (error) {
console.error('收藏操作失败:', error);
Message.error('网络请求失败,请重试');
}
};
// 取消编辑 // 取消编辑
const cancelEdit = (item) => { const cancelEdit = (item) => {
debugger
item.isEditing = false; item.isEditing = false;
item.tempTitle = item.title; // 恢复原始标题 item.tempTitle = item.title; // 恢复原始标题
}; };
@@ -360,13 +376,13 @@ const cardList = ref([
} }
]); ]);
const dhlsList = ref([]); const dhlsList = ref([]);
const collectionList = ref([]);
const VITE_AI_API_HOST = import.meta.env.VITE_AI_API_HOST; const VITE_AI_API_HOST = import.meta.env.VITE_AI_API_HOST;
const getQuestionHistory = async () => { const getQuestionHistory = async () => {
if(props.username) { if(props.username) {
const {data} = await axios.get(VITE_AI_API_HOST + '/api/conversationList?userId='+props.username); const {data} = await axios.get(VITE_AI_API_HOST + '/api/conversationList?userId='+props.username + '&list_type=history');
if(data.conversationList) { if(data.conversationList) {
debugger
dhlsList.value = data.conversationList dhlsList.value = data.conversationList
} else { } else {
// Message.error(data.error||'接口异常!') // Message.error(data.error||'接口异常!')
@@ -375,9 +391,22 @@ const getQuestionHistory = async () => {
Message.error('请先登录!') Message.error('请先登录!')
} }
}; };
const getQuestionCollection = async () => {
if(props.username) {
const {data} = await axios.get(VITE_AI_API_HOST + '/api/conversationList?userId='+props.username + '&list_type=collection');
if(data.conversationList) {
collectionList.value = data.conversationList
} else {
// Message.error(data.error||'接口异常!')
}
} else {
Message.error('请先登录!')
}
};
onMounted(() => { onMounted(() => {
getQuestionHistory() getQuestionHistory()
getQuestionCollection()
}); });
defineExpose({ defineExpose({
@@ -467,4 +496,15 @@ defineExpose({
} }
} }
.list-menu {
padding: 8px;
.menu-item {
cursor: pointer;
display: flex;
align-items: baseline;
//justify-content: space-around;
}
}
</style> </style>