diff --git a/src/components/BasicTree/Tree.vue b/src/components/BasicTree/Tree.vue index 31d761e..399decb 100644 --- a/src/components/BasicTree/Tree.vue +++ b/src/components/BasicTree/Tree.vue @@ -30,14 +30,14 @@ :src="item.lastRank ? lastIcon : item.showChild ? currentIcon : defaultIcon"> {{ item.name }} - - + + + :style="{'border-color': !item.lastRank ? '#ccc' : confirmColor}"> @@ -277,17 +277,16 @@ export default { // console.log(this.treeList) }, _treeItemSelect(item, index) { + // 只有叶子节点才能被选择 + if (!item.lastRank) { + // 如果不是叶子节点,不允许选择 + return; + } + if (this.multiple) { - if (!item.lastRank) { - // 父节点多选框:全选/全不选所有子节点 - const allChecked = this._isAllChildrenChecked(item); - this._setAllChildrenChecked(item, !allChecked); - item.checked = !allChecked; - } else { - // 子节点单独切换 - this.treeList[index].checked = !this.treeList[index].checked; - this._updateParentChecked(item); - } + // 子节点单独切换 + this.treeList[index].checked = !this.treeList[index].checked; + this._updateParentChecked(item); this._fixMultiple(index); } else { // 单选逻辑 @@ -496,4 +495,14 @@ export default { opacity: 0.6; } +.tki-tree-check.disabled { + opacity: 0.4; + cursor: not-allowed; +} + +.tki-tree-check.disabled .tki-tree-check-no { + border-color: #ccc !important; + background-color: #f5f5f5; +} + diff --git a/src/pages/view/routine/JiaoXueZiYuan/add-resource.vue b/src/pages/view/routine/JiaoXueZiYuan/add-resource.vue index 0da8039..1b17f8c 100644 --- a/src/pages/view/routine/JiaoXueZiYuan/add-resource.vue +++ b/src/pages/view/routine/JiaoXueZiYuan/add-resource.vue @@ -1,15 +1,5 @@ @@ -152,6 +145,7 @@ import { typesFindTreeApi } from "@/api/base/server"; import { attachmentUpload } from "@/api/system/upload"; import { imagUrl } from "@/utils"; import { useDicStore } from "@/store/modules/dic"; +import BasicTree from "@/components/BasicTree/Tree.vue"; const { findByPid } = useDicStore(); @@ -182,6 +176,9 @@ const formData = reactive({ // 树形数据 const treeData = ref([]); +// 树组件引用 +const treeRef = ref(); + // 提交状态 const isSubmitting = ref(false); @@ -191,15 +188,29 @@ const categoryOptions = ref([]); // 加载资源类别数据 const loadCategoryOptions = async () => { try { + // 使用正确的字典ID const result = await findByPid({ pid: 1391443399 }); - if (result && Array.isArray(result)) { - categoryOptions.value = result.map(item => ({ + + // 检查返回的数据结构 + if (result && result.resultCode === 1 && result.result && Array.isArray(result.result) && result.result.length > 0) { + categoryOptions.value = result.result.map(item => ({ value: item.dictionaryCode, label: item.dictionaryValue })); + } else { + // 如果没有数据,使用默认选项 + categoryOptions.value = [ + { value: '1', label: '课件' }, + { value: '2', label: '教案' }, + { value: '3', label: '学案' }, + { value: '4', label: '作业' }, + { value: '5', label: '试卷' }, + { value: '6', label: '教材' }, + { value: '7', label: '示范课' }, + { value: '8', label: '音视频合集' }, + ]; } } catch (error) { - console.error('加载资源类别失败:', error); // 如果加载失败,使用默认选项 categoryOptions.value = [ { value: '1', label: '课件' }, @@ -214,16 +225,26 @@ const loadCategoryOptions = async () => { } }; -// 返回上一页 -const goBack = () => { - uni.navigateBack(); + + +// 显示资源目录选择树 +const showResourceTypeTree = () => { + if (treeRef.value) { + treeRef.value._show(); + } }; -// 资源目录选择 -const handleResourceTypeChange = (e: any) => { - const index = e.detail.value; - const selectedItem = treeData.value[index]; - formData.resourType = selectedItem.key; +// 树形选择确认 +const onTreeConfirm = (selectedItems: any[]) => { + if (selectedItems.length > 0) { + const selectedItem = selectedItems[0]; // 单选模式 + formData.resourType = selectedItem.key; + } +}; + +// 树形选择取消 +const onTreeCancel = () => { + // 取消选择资源目录 }; // 资源类别选择 @@ -415,7 +436,7 @@ const handleSubmitForm = async () => { id: formData.id }; - console.log('提交参数:', params); + const result = await resourcesSaveApi(params); @@ -457,16 +478,45 @@ const resetFormData = () => { const loadTreeData = async () => { try { const res = await typesFindTreeApi(); - treeData.value = res.result || []; - console.log('树形数据加载完成:', treeData.value); + // 处理返回的数据结构,确保与BasicTree组件兼容 + if (res && Array.isArray(res)) { + treeData.value = res.map(item => ({ + key: item.key || item.id, + title: item.title || item.name, + children: item.children ? item.children.map(child => ({ + key: child.key || child.id, + title: child.title || child.name, + children: child.children || [] + })) : [] + })); + } else { + treeData.value = res.result || []; + } + } catch (error) { - console.error('加载树形数据失败:', error); + + // 如果加载失败,使用空数组 + treeData.value = []; } }; // 获取资源目录文本 const getResourceTypeText = () => { - const selectedItem = treeData.value.find(item => item.key === formData.resourType); + // 递归查找选中的项目 + const findSelectedItem = (items: any[], targetKey: string): any => { + for (const item of items) { + if (item.key === targetKey) { + return item; + } + if (item.children && item.children.length > 0) { + const found = findSelectedItem(item.children, targetKey); + if (found) return found; + } + } + return null; + }; + + const selectedItem = findSelectedItem(treeData.value, formData.resourType); return selectedItem ? selectedItem.title : ''; }; @@ -490,39 +540,7 @@ onMounted(async () => { flex-direction: column; } -.page-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 20rpx 30rpx; - background-color: #ffffff; - border-bottom: 1rpx solid #f0f0f0; - position: sticky; - top: 0; - z-index: 10; -} -.header-left { - display: flex; - align-items: center; - gap: 10rpx; - cursor: pointer; -} - -.back-text { - font-size: 28rpx; - color: #333; -} - -.header-title { - font-size: 32rpx; - font-weight: bold; - color: #333; -} - -.header-right { - width: 80rpx; -} .form-scroll-view { flex: 1; @@ -671,19 +689,8 @@ onMounted(async () => { border-top: 1rpx solid #f0f0f0; } -.cancel-btn { - flex: 1; - padding: 20rpx; - border-radius: 8rpx; - font-size: 28rpx; - font-weight: 500; - border: none; - background: #f5f5f5; - color: #666; -} - .confirm-btn { - flex: 1; + width: 100%; padding: 20rpx; border-radius: 8rpx; font-size: 28rpx; diff --git a/src/utils/filePreview.ts b/src/utils/filePreview.ts index 751cde3..6a6f78c 100644 --- a/src/utils/filePreview.ts +++ b/src/utils/filePreview.ts @@ -230,7 +230,7 @@ export const previewFile = (fileUrl: string, fileName: string, fileType: string) const encodedUrl = btoa(finalFileUrl); console.log('使用kkFileView预览,Base64编码后的URL:', encodedUrl); - const previewUrl = `http://yufangzc.com:8891/onlinePreview?url=${encodeURIComponent(encodedUrl)}`; + const previewUrl = `${KK_FILE_VIEW_URL}/onlinePreview?url=${encodeURIComponent(encodedUrl)}`; console.log('最终预览URL (普通文件):', previewUrl); const needLandscape = ['ppt', 'pptx'].includes(type);