diff --git a/web/src/views/Skill.vue b/web/src/views/Skill.vue
index 5aee76b..29358fe 100644
--- a/web/src/views/Skill.vue
+++ b/web/src/views/Skill.vue
@@ -371,10 +371,10 @@ onMounted(() => {
-
+
-
+
@@ -408,7 +408,7 @@ onMounted(() => {
{{ isImporting ? 'Importing...' : 'Import' }}
-
+
diff --git a/web/src/views/skill/useSkills.ts b/web/src/views/skill/useSkills.ts
deleted file mode 100644
index a8e4ae6..0000000
--- a/web/src/views/skill/useSkills.ts
+++ /dev/null
@@ -1,301 +0,0 @@
-import { ref, computed } from 'vue'
-import { ElMessageBox, ElMessage } from 'element-plus'
-
-const API_BASE = 'http://localhost:8082'
-
-export interface Skill {
- id: string
- skill_name: string
- skill_type: string
- skill_desc: string
- path: string
- status: string
- created_at?: string
- updated_at?: string
-}
-
-export function useSkills() {
- const skills = ref([])
- const skillsLoading = ref(false)
-
- // 获取技能列表
- const fetchSkills = async (type?: string) => {
- skillsLoading.value = true
- try {
- let url = `${API_BASE}/skill/list`
- if (type) {
- url += `?type=${type}`
- }
-
- const response = await fetch(url)
- const result = await response.json()
-
- if (result.list) {
- skills.value = result.list.map((skill: any) => ({
- id: skill.id,
- skill_name: skill.skill_name,
- skill_type: skill.skill_type,
- skill_desc: skill.skill_desc || '',
- path: skill.path || '',
- status: skill.status || 'active',
- created_at: skill.created_at,
- updated_at: skill.updated_at,
- }))
- }
- return result.list || []
- } catch (error) {
- console.error('Failed to fetch skills:', error)
- return []
- } finally {
- skillsLoading.value = false
- }
- }
-
- // 同步技能
- const syncSkills = async () => {
- try {
- const response = await fetch(`${API_BASE}/skill/sync`)
- const data = await response.json()
- await fetchSkills()
- return data
- } catch (error) {
- console.error('Failed to sync skills:', error)
- throw error
- }
- }
-
- // 获取技能详情
- const fetchSkillById = async (id: string) => {
- try {
- const response = await fetch(`${API_BASE}/skill/${id}`)
- const data = await response.json()
- return data.skill
- } catch (error) {
- console.error('Failed to fetch skill:', error)
- throw error
- }
- }
-
- // 创建技能
- const createSkill = async (skill: Partial) => {
- try {
- const response = await fetch(`${API_BASE}/skill/add`, {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(skill),
- })
- const data = await response.json()
- await fetchSkills()
- return data
- } catch (error) {
- console.error('Failed to create skill:', error)
- throw error
- }
- }
-
- // 更新技能
- const updateSkill = async (id: string, skill: Partial) => {
- try {
- const response = await fetch(`${API_BASE}/skill/${id}`, {
- method: 'PUT',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(skill),
- })
- const data = await response.json()
- await fetchSkills()
- return data
- } catch (error) {
- console.error('Failed to update skill:', error)
- throw error
- }
- }
-
- // 删除技能
- const deleteSkill = async (id: string) => {
- try {
- const response = await fetch(`${API_BASE}/skill/${id}`, {
- method: 'DELETE',
- })
- const data = await response.json()
- await fetchSkills()
- return data
- } catch (error) {
- console.error('Failed to delete skill:', error)
- throw error
- }
- }
-
- // 按类型获取技能
- const getSkillsByType = (type: string) => {
- return skills.value.filter(skill => skill.skill_type === type)
- }
-
- // 获取所有分类
- const categories = computed(() => {
- const cats = new Set(skills.value.map(skill => skill.skill_type))
- return Array.from(cats)
- })
-
- // 搜索和筛选
- const searchQuery = ref('')
- const filterStatus = ref('all')
-
- // 编辑状态
- const isEditing = ref(false)
- const isCreating = ref(false)
- const editingSkill = ref(null)
-
- // 表单
- const editForm = ref({
- skill_name: '',
- skill_desc: '',
- skill_type: 'user',
- })
-
- const newSkillForm = ref({
- skill_name: '',
- skill_desc: '',
- skill_type: 'user',
- })
-
- // 筛选
- const filteredSkills = computed(() => {
- return skills.value.filter(skill => {
- const matchSearch = skill.skill_name.toLowerCase().includes(searchQuery.value.toLowerCase()) ||
- (skill.skill_desc && skill.skill_desc.toLowerCase().includes(searchQuery.value.toLowerCase()))
- const matchStatus = filterStatus.value === 'all' || skill.status === filterStatus.value
- return matchSearch && matchStatus
- })
- })
-
- // 状态样式
- const statusClass = (status: string) => {
- switch (status) {
- case 'active': return 'bg-green-500'
- case 'inactive': return 'bg-gray-500'
- case 'error': return 'bg-red-500'
- default: return 'bg-gray-500'
- }
- }
-
- // 打开创建弹窗
- const openCreate = () => {
- newSkillForm.value = { skill_name: '', skill_desc: '', skill_type: 'user' }
- isCreating.value = true
- }
-
- // 关闭创建弹窗
- const closeCreate = () => {
- isCreating.value = false
- }
-
- // 保存新技能
- const saveNewSkill = async () => {
- try {
- await createSkill({
- skill_name: newSkillForm.value.skill_name,
- skill_desc: newSkillForm.value.skill_desc,
- skill_type: newSkillForm.value.skill_type,
- status: 'active',
- })
- ElMessage.success('Skill created successfully')
- isCreating.value = false
- } catch (error) {
- ElMessage.error('Failed to create skill')
- }
- }
-
- // 打开编辑弹窗
- const openEdit = (skill: Skill) => {
- editingSkill.value = skill
- editForm.value = {
- skill_name: skill.skill_name,
- skill_desc: skill.skill_desc,
- skill_type: skill.skill_type,
- }
- isEditing.value = true
- }
-
- // 关闭编辑弹窗
- const closeEdit = () => {
- isEditing.value = false
- editingSkill.value = null
- }
-
- // 保存编辑
- const saveEdit = async () => {
- try {
- await updateSkill(editingSkill.value!.id, {
- skill_name: editForm.value.skill_name,
- skill_desc: editForm.value.skill_desc,
- skill_type: editForm.value.skill_type,
- })
- ElMessage.success('Skill updated successfully')
- isEditing.value = false
- } catch (error) {
- ElMessage.error('Failed to update skill')
- }
- }
-
- // 切换状态
- const toggleStatus = async (skill: Skill) => {
- const newStatus = skill.status === 'active' ? 'inactive' : 'active'
- try {
- await updateSkill(skill.id, { status: newStatus })
- skill.status = newStatus
- } catch (error) {
- ElMessage.error('Failed to update status')
- }
- }
-
- // 删除技能
- const handleDeleteSkill = async (id: string) => {
- try {
- await ElMessageBox.confirm('Are you sure you want to delete this skill?', 'Confirm Delete', {
- confirmButtonText: 'Delete',
- cancelButtonText: 'Cancel',
- type: 'warning',
- })
-
- await deleteSkill(id)
- ElMessage.success('Skill deleted successfully')
- } catch (error: any) {
- if (error !== 'cancel') {
- console.error('Failed to delete skill:', error)
- ElMessage.error('Failed to delete skill')
- }
- }
- }
-
- return {
- // State
- skills,
- skillsLoading,
- searchQuery,
- filterStatus,
- isEditing,
- isCreating,
- editingSkill,
- editForm,
- newSkillForm,
- categories,
- // Computed
- filteredSkills,
- // Methods
- fetchSkills,
- syncSkills,
- statusClass,
- openCreate,
- closeCreate,
- saveNewSkill,
- openEdit,
- closeEdit,
- saveEdit,
- toggleStatus,
- deleteSkill: handleDeleteSkill,
- }
-}