更新skill用户接口配置

This commit is contained in:
2026-05-09 13:59:14 +08:00
parent 2e6af6e06c
commit 05ba57282f
3 changed files with 93 additions and 25 deletions

View File

@@ -91,6 +91,17 @@ export function getUserSkillList(params?: UserSkillListParams, config?: any) {
...config,
});
}
/**
* 获取 Skill 用户技能列表
*/
export function getUserSkilllistUser(params?: UserSkillListParams, config?: any) {
return request<SkillListResponse>({
url: '/ai-agent/skill/user/listUser',
method: 'get',
params,
...config,
});
}
/**
* 创建 Skill 用户技能

View File

@@ -4,14 +4,22 @@
<el-tab-pane label="系统技能" name="system">
<div class="search-bar">
<el-input v-model="searchParams.keyword" placeholder="搜索技能名称或描述" clearable @clear="handleSearch">
<template #prefix><el-icon><Search /></el-icon></template>
<template #prefix
><el-icon><Search /></el-icon
></template>
</el-input>
<el-button type="primary" @click="handleSearch">搜索</el-button>
</div>
<div class="skill-list" v-loading="loading">
<el-empty v-if="!loading && skillList.length === 0" description="暂无技能数据" :image-size="100" />
<div v-else class="skill-grid">
<div v-for="skill in skillList" :key="skill.id" class="skill-card" :class="{ selected: selectedSkill?.id === skill.id }" @click="handleSelectSkill(skill)">
<div
v-for="skill in skillList"
:key="skill.id"
class="skill-card"
:class="{ selected: selectedSkill?.id === skill.id }"
@click="handleSelectSkill(skill)"
>
<div class="skill-card-header">
<div class="skill-category">{{ skill.category }}</div>
<el-icon v-if="selectedSkill?.id === skill.id" class="check-icon" color="#67c23a"><CircleCheck /></el-icon>
@@ -24,20 +32,36 @@
</div>
</div>
<div v-if="pagination.total > 0" class="pagination-wrap">
<el-pagination v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize" :total="pagination.total" :page-sizes="[10, 20, 50]" layout="total, prev, pager, next" small @current-change="handlePageChange" />
<el-pagination
v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize"
:total="pagination.total"
:page-sizes="[10, 20, 50]"
layout="total, prev, pager, next"
small
@current-change="handlePageChange"
/>
</div>
</el-tab-pane>
<el-tab-pane label="用户技能" name="user">
<div class="search-bar">
<el-input v-model="searchParams.keyword" placeholder="搜索技能名称或描述" clearable @clear="handleSearch">
<template #prefix><el-icon><Search /></el-icon></template>
<template #prefix
><el-icon><Search /></el-icon
></template>
</el-input>
<el-button type="primary" @click="handleSearch">搜索</el-button>
</div>
<div class="skill-list" v-loading="loading">
<el-empty v-if="!loading && skillList.length === 0" description="暂无技能数据" :image-size="100" />
<div v-else class="skill-grid">
<div v-for="skill in skillList" :key="skill.id" class="skill-card" :class="{ selected: selectedSkill?.id === skill.id }" @click="handleSelectSkill(skill)">
<div
v-for="skill in skillList"
:key="skill.id"
class="skill-card"
:class="{ selected: selectedSkill?.id === skill.id }"
@click="handleSelectSkill(skill)"
>
<div class="skill-card-header">
<div class="skill-category">{{ skill.category }}</div>
<el-icon v-if="selectedSkill?.id === skill.id" class="check-icon" color="#67c23a"><CircleCheck /></el-icon>
@@ -50,7 +74,15 @@
</div>
</div>
<div v-if="pagination.total > 0" class="pagination-wrap">
<el-pagination v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize" :total="pagination.total" :page-sizes="[10, 20, 50]" layout="total, prev, pager, next" small @current-change="handlePageChange" />
<el-pagination
v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize"
:total="pagination.total"
:page-sizes="[10, 20, 50]"
layout="total, prev, pager, next"
small
@current-change="handlePageChange"
/>
</div>
</el-tab-pane>
</el-tabs>
@@ -64,7 +96,7 @@
<script setup lang="ts">
import { ref, reactive, watch } from 'vue';
import { Search, CircleCheck } from '@element-plus/icons-vue';
import { getSkillList, getUserSkillList, type SkillItem } from '/@/api/digitalHuman/skill';
import { getSkillList, getUserSkilllistUser, type SkillItem } from '/@/api/digitalHuman/skill';
interface Props {
modelValue: boolean;
@@ -91,13 +123,16 @@ const skillList = ref<SkillItem[]>([]);
const loading = ref(false);
const selectedSkill = ref<SkillItem | null>(null);
watch(() => props.modelValue, (val) => {
visible.value = val;
if (val) {
selectedSkill.value = props.defaultSkill || null;
fetchSkillList();
watch(
() => props.modelValue,
(val) => {
visible.value = val;
if (val) {
selectedSkill.value = props.defaultSkill || null;
fetchSkillList();
}
}
});
);
watch(visible, (val) => {
if (!val) {
@@ -116,7 +151,10 @@ const fetchSkillList = async () => {
loading.value = true;
try {
const params = { pageNum: pagination.pageNum, pageSize: pagination.pageSize, keyword: searchParams.keyword || undefined };
const res = activeTab.value === 'system' ? await getSkillList(params, { errorMode: 'message' }) : await getUserSkillList(params, { errorMode: 'message' });
const res =
activeTab.value === 'system'
? await getSkillList(params, { errorMode: 'message' })
: await getUserSkilllistUser(params, { errorMode: 'message' });
skillList.value = res.data?.list || [];
pagination.total = res.data?.total || 0;
} catch (error) {

View File

@@ -2,14 +2,22 @@
<el-dialog v-model="visible" title="选择技能" width="900px" :close-on-click-modal="false" @close="handleClose">
<div class="search-bar">
<el-input v-model="searchParams.keyword" placeholder="搜索技能名称或描述" clearable @clear="handleSearch">
<template #prefix><el-icon><Search /></el-icon></template>
<template #prefix
><el-icon><Search /></el-icon
></template>
</el-input>
<el-button type="primary" @click="handleSearch">搜索</el-button>
</div>
<div class="skill-list" v-loading="loading">
<el-empty v-if="!loading && skillList.length === 0" description="暂无技能数据" :image-size="100" />
<div v-else class="skill-grid">
<div v-for="skill in skillList" :key="skill.id" class="skill-card" :class="{ selected: selectedSkill?.id === skill.id }" @click="handleSelectSkill(skill)">
<div
v-for="skill in skillList"
:key="skill.id"
class="skill-card"
:class="{ selected: selectedSkill?.id === skill.id }"
@click="handleSelectSkill(skill)"
>
<div class="skill-card-header">
<div class="skill-category">{{ skill.category }}</div>
<el-icon v-if="selectedSkill?.id === skill.id" class="check-icon" color="#67c23a"><CircleCheck /></el-icon>
@@ -22,7 +30,15 @@
</div>
</div>
<div v-if="pagination.total > 0" class="pagination-wrap">
<el-pagination v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize" :total="pagination.total" :page-sizes="[10, 20, 50]" layout="total, prev, pager, next" small @current-change="handlePageChange" />
<el-pagination
v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize"
:total="pagination.total"
:page-sizes="[10, 20, 50]"
layout="total, prev, pager, next"
small
@current-change="handlePageChange"
/>
</div>
<template #footer>
<el-button @click="handleClose">取消</el-button>
@@ -34,7 +50,7 @@
<script setup lang="ts">
import { ref, reactive, watch } from 'vue';
import { Search, CircleCheck } from '@element-plus/icons-vue';
import { getUserSkillList, type SkillItem } from '/@/api/digitalHuman/skill';
import { getUserSkilllistUser, type SkillItem } from '/@/api/digitalHuman/skill';
interface Props {
modelValue: boolean;
@@ -60,13 +76,16 @@ const skillList = ref<SkillItem[]>([]);
const loading = ref(false);
const selectedSkill = ref<SkillItem | null>(null);
watch(() => props.modelValue, (val) => {
visible.value = val;
if (val) {
selectedSkill.value = props.defaultSkill || null;
fetchSkillList();
watch(
() => props.modelValue,
(val) => {
visible.value = val;
if (val) {
selectedSkill.value = props.defaultSkill || null;
fetchSkillList();
}
}
});
);
watch(visible, (val) => {
if (!val) {
@@ -78,7 +97,7 @@ const fetchSkillList = async () => {
loading.value = true;
try {
const params = { pageNum: pagination.pageNum, pageSize: pagination.pageSize, keyword: searchParams.keyword || undefined };
const res = await getUserSkillList(params, { errorMode: 'message' });
const res = await getUserSkilllistUser(params, { errorMode: 'message' });
skillList.value = res.data?.list || [];
pagination.total = res.data?.total || 0;
} catch (error) {