Browse Source

资源重新排版和优化

zq 1 month ago
parent
commit
643958119e

+ 12 - 0
src/api/book.js

@@ -383,3 +383,15 @@ export function SearchBookContentText(data) {
 export function GetBookInfo(data) {
   return http.post(`${process.env.VUE_APP_EepServer}?MethodName=book_manager-GetBookInfo`, data);
 }
+
+/**
+ * @description 得到教材章节结构展开列表
+ * @param {object} data
+ * @param {string} data.id 教材ID
+ */
+export function GetBookChapterStructExpandList(data) {
+  return http.post(
+    `${process.env.VUE_APP_EepServer}?MethodName=book_chapter_manager-GetBookChapterStructExpandList`,
+    data,
+  );
+}

+ 6 - 0
src/assets/icon/sidebar-audio.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 576 512" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M215.03 71.05L126.06 160H24c-13.26 0-24 10.74-24 24v144c0 13.25 10.74 24 24 24h102.06l88.97 88.95c15.03 15.03 40.97 4.47 40.97-16.97V88.02c0-21.46-25.96-31.98-40.97-16.97zm233.32-51.08c-11.17-7.33-26.18-4.24-33.51 6.95-7.34 11.17-4.22 26.18 6.95 33.51 66.27 43.49 105.82 116.6 105.82 195.58 0 78.98-39.55 152.09-105.82 195.58-11.17 7.32-14.29 22.34-6.95 33.5 7.04 10.71 21.93 14.56 33.51 6.95C528.27 439.58 576 351.33 576 256S528.27 72.43 448.35 19.97zM480 256c0-63.53-32.06-121.94-85.77-156.24-11.19-7.14-26.03-3.82-33.12 7.46s-3.78 26.21 7.41 33.36C408.27 165.97 432 209.11 432 256s-23.73 90.03-63.48 115.42c-11.19 7.14-14.5 22.07-7.41 33.36 6.51 10.36 21.12 15.14 33.12 7.46C447.94 377.94 480 319.54 480 256zm-141.77-76.87c-11.58-6.33-26.19-2.16-32.61 9.45-6.39 11.61-2.16 26.2 9.45 32.61C327.98 228.28 336 241.63 336 256c0 14.38-8.02 27.72-20.92 34.81-11.61 6.41-15.84 21-9.45 32.61 6.43 11.66 21.05 15.8 32.61 9.45 28.23-15.55 45.77-45 45.77-76.88s-17.54-61.32-45.78-76.86z" fill="rgba(51,51,51,1)"></path>
+    </g>
+  </svg>

+ 1 - 0
src/assets/icon/sidebar-audit.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1768734435805" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9782" width="32" height="32" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M849.554286 109.714286H174.445714C118.491429 109.787429 73.179429 152.978286 73.142857 206.262857v514.925714c0 53.211429 45.421714 96.548571 101.302857 96.548572h222.317715l91.355428 87.113143a34.925714 34.925714 0 0 0 47.762286 0l91.355428-87.113143h222.354286c55.844571 0 101.266286-43.337143 101.266286-96.548572V206.262857C950.857143 153.014857 905.435429 109.714286 849.554286 109.714286m-5.12 73.142857c18.358857 0 33.28 13.933714 33.28 31.085714v497.444572c0 17.152-14.921143 31.085714-33.28 31.085714h-218.916572c-17.664 0-34.56 6.582857-47.030857 18.212571L512 822.857143l-66.486857-62.171429a68.827429 68.827429 0 0 0-47.030857-18.212571H179.565714c-18.322286 0-33.243429-13.933714-33.243428-31.085714V213.942857c0-17.152 14.921143-31.085714 33.28-31.085714h664.868571" fill="#333333" p-id="9783"></path><path d="M301.714286 484.571429m-45.714286 0a45.714286 45.714286 0 1 0 91.428571 0 45.714286 45.714286 0 1 0-91.428571 0Z" fill="#333333" p-id="9784"></path><path d="M521.142857 484.571429m-45.714286 0a45.714286 45.714286 0 1 0 91.428572 0 45.714286 45.714286 0 1 0-91.428572 0Z" fill="#333333" p-id="9785"></path><path d="M740.571429 484.571429m-45.714286 0a45.714286 45.714286 0 1 0 91.428571 0 45.714286 45.714286 0 1 0-91.428571 0Z" fill="#333333" p-id="9786"></path></svg>

+ 6 - 0
src/assets/icon/sidebar-catalogue.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M28 6h-24v2h24v-2zM28 14h-24v2h24v-2zM28 22h-24v2h24v-2z" fill="rgba(16,16,16,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-collect.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M4 24.667v-18c0-2.209 1.791-4 4-4v0h18.667c0.736 0 1.333 0.597 1.333 1.333v0 24c0 0.736-0.597 1.333-1.333 1.333v0h-18c-2.577 0-4.667-2.089-4.667-4.667v0zM25.333 26.667v-4h-16.667c-1.105 0-2 0.895-2 2s0.895 2 2 2v0h16.667zM13.333 5.333h-5.333c-0.736 0-1.333 0.597-1.333 1.333v0 13.783c0.583-0.284 1.269-0.449 1.994-0.449 0.002 0 0.004 0 0.007 0h16.666v-14.667h-2.667v10.667l-4.667-2.667-4.667 2.667v-10.667z" fill="rgba(51,51,51,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-file.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M26.667 29.333h-21.333c-0.736 0-1.333-0.597-1.333-1.333v0-24c0-0.736 0.597-1.333 1.333-1.333v0h21.333c0.736 0 1.333 0.597 1.333 1.333v0 24c0 0.736-0.597 1.333-1.333 1.333v0zM25.333 26.667v-21.333h-18.667v21.333h18.667zM10.667 9.333h10.667v2.667h-10.667v-2.667zM10.667 14.667h10.667v2.667h-10.667v-2.667zM10.667 20h10.667v2.667h-10.667v-2.667z" fill="rgba(51,51,51,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-fold.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" style="border-color: rgba(187,187,187,1);border-width: 1;border-style: solid" filter="none">
+    
+    <g>
+    <path d="M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z" fill="rgba(51,51,51,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-fullScreen.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="64 64 896 896" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M290 236.4l43.9-43.9a8.01 8.01 0 0 0-4.7-13.6L169 160c-5.1-.6-9.5 3.7-8.9 8.9L179 329.1c.8 6.6 8.9 9.4 13.6 4.7l43.7-43.7L370 423.7c3.1 3.1 8.2 3.1 11.3 0l42.4-42.3c3.1-3.1 3.1-8.2 0-11.3L290 236.4zm352.7 187.3c3.1 3.1 8.2 3.1 11.3 0l133.7-133.6 43.7 43.7a8.01 8.01 0 0 0 13.6-4.7L863.9 169c.6-5.1-3.7-9.5-8.9-8.9L694.8 179c-6.6.8-9.4 8.9-4.7 13.6l43.9 43.9L600.3 370a8.03 8.03 0 0 0 0 11.3l42.4 42.4zM845 694.9c-.8-6.6-8.9-9.4-13.6-4.7l-43.7 43.7L654 600.3a8.03 8.03 0 0 0-11.3 0l-42.4 42.3a8.03 8.03 0 0 0 0 11.3L734 787.6l-43.9 43.9a8.01 8.01 0 0 0 4.7 13.6L855 864c5.1.6 9.5-3.7 8.9-8.9L845 694.9zm-463.7-94.6a8.03 8.03 0 0 0-11.3 0L236.3 733.9l-43.7-43.7a8.01 8.01 0 0 0-13.6 4.7L160.1 855c-.6 5.1 3.7 9.5 8.9 8.9L329.2 845c6.6-.8 9.4-8.9 4.7-13.6L290 787.6 423.7 654c3.1-3.1 3.1-8.2 0-11.3l-42.4-42.4z" fill="rgba(16,16,16,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-image.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M39 6H9C7.34315 6 6 7.34315 6 9V39C6 40.6569 7.34315 42 9 42H39C40.6569 42 42 40.6569 42 39V9C42 7.34315 40.6569 6 39 6Z" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M18 23C20.7614 23 23 20.7614 23 18C23 15.2386 20.7614 13 18 13C15.2386 13 13 15.2386 13 18C13 20.7614 15.2386 23 18 23Z" fill="none" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"></path><path d="M27.7901 26.2193C28.6064 25.1268 30.2528 25.1537 31.0329 26.2724L39.8077 38.856C40.7322 40.1819 39.7835 42 38.1671 42H16L27.7901 26.2193Z" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path>
+    </g>
+  </svg>

File diff suppressed because it is too large
+ 3 - 0
src/assets/icon/sidebar-knowledge.svg


+ 6 - 0
src/assets/icon/sidebar-mindmap.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M8 28C10.2091 28 12 26.2091 12 24C12 21.7909 10.2091 20 8 20C5.79086 20 4 21.7909 4 24C4 26.2091 5.79086 28 8 28Z" fill="none" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linejoin="round"></path><path d="M42 8C43.1046 8 44 7.10457 44 6C44 4.89543 43.1046 4 42 4C40.8954 4 40 4.89543 40 6C40 7.10457 40.8954 8 42 8Z" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linejoin="round" fill="none"></path><path d="M42 26C43.1046 26 44 25.1046 44 24C44 22.8954 43.1046 22 42 22C40.8954 22 40 22.8954 40 24C40 25.1046 40.8954 26 42 26Z" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linejoin="round" fill="none"></path><path d="M42 44C43.1046 44 44 43.1046 44 42C44 40.8954 43.1046 40 42 40C40.8954 40 40 40.8954 40 42C40 43.1046 40.8954 44 42 44Z" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linejoin="round" fill="none"></path><path d="M32 6H20V42H32" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M12 24H32" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-note.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M17 14L29 14" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M23 28L23 15" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M20.1429 42H8C6.89543 42 6 41.1046 6 40V7C6 5.89543 6.89543 5 8 5H40C41.1046 5 42 5.89543 42 7V16.7167" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M27 38L37.5 23.5L42 27L31 42H27V38Z" fill="none" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-search.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <rect width="48" height="48" fill="rgba(51,51,51,1)" fill-opacity="0.01" stroke="none"></rect><path d="M21 38C30.3888 38 38 30.3888 38 21C38 11.6112 30.3888 4 21 4C11.6112 4 4 11.6112 4 21C4 30.3888 11.6112 38 21 38Z" fill="none" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linejoin="round"></path><path d="M26.6568 14.3431C25.2091 12.8954 23.2091 12 21 12C18.7909 12 16.7909 12.8954 15.3431 14.3431" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M33.2218 33.2218L41.7071 41.7071" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-setting.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <rect width="48" height="48" fill="rgba(51,51,51,1)" fill-opacity="0.01" stroke="none"></rect><path d="M36.686 15.171C37.9364 16.9643 38.8163 19.0352 39.2147 21.2727H44V26.7273H39.2147C38.8163 28.9648 37.9364 31.0357 36.686 32.829L40.0706 36.2137L36.2137 40.0706L32.829 36.686C31.0357 37.9364 28.9648 38.8163 26.7273 39.2147V44H21.2727V39.2147C19.0352 38.8163 16.9643 37.9364 15.171 36.686L11.7863 40.0706L7.92939 36.2137L11.314 32.829C10.0636 31.0357 9.18372 28.9648 8.78533 26.7273H4V21.2727H8.78533C9.18372 19.0352 10.0636 16.9643 11.314 15.171L7.92939 11.7863L11.7863 7.92939L15.171 11.314C16.9643 10.0636 19.0352 9.18372 21.2727 8.78533V4H26.7273V8.78533C28.9648 9.18372 31.0357 10.0636 32.829 11.314L36.2137 7.92939L40.0706 11.7863L36.686 15.171Z" fill="none" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linejoin="round"></path><path d="M24 29C26.7614 29 29 26.7614 29 24C29 21.2386 26.7614 19 24 19C21.2386 19 19 21.2386 19 24C19 26.7614 21.2386 29 24 29Z" fill="none" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linejoin="round"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-toolkit.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 512 512" width="24" height="24" style="border-color: rgba(64,149,229,1);border-width: 0;border-style: solid" filter="none">
+    <defs><linearGradient id="V8OmZ1sSYzK4PG1" x1="0" x2="100%" y1="0" y2="0" gradientTransform="matrix(6.123233995736766e-17, 1, -1, 6.123233995736766e-17, 256, 0)" gradientUnits="userSpaceOnUse"><stop stop-color="#4095e5" stop-opacity="0.95" offset="0.33"></stop><stop stop-color="#ffffff" stop-opacity="0" offset="1"></stop></linearGradient></defs>
+    <g>
+    <path d="M320 336c0 8.84-7.16 16-16 16h-96c-8.84 0-16-7.16-16-16v-48H0v144c0 25.6 22.4 48 48 48h416c25.6 0 48-22.4 48-48V288H320v48zm144-208h-80V80c0-25.6-22.4-48-48-48H176c-25.6 0-48 22.4-48 48v48H48c-25.6 0-48 22.4-48 48v80h512v-80c0-25.6-22.4-48-48-48zm-144 0H192V96h128v32z" fill="url(#V8OmZ1sSYzK4PG1)"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-totalResources.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M29.333 13.332v13.335c0 0.736-0.597 1.333-1.333 1.333v0h-10.667v-14.668h12zM14.667 21.332v6.668h-10.667c-0.736 0-1.333-0.597-1.333-1.333v0-5.335h12zM14.667 4v14.665h-12v-13.332c0-0.736 0.597-1.333 1.333-1.333v0h10.667zM28 4c0.736 0 1.333 0.597 1.333 1.333v0 5.332h-12v-6.665h10.667z" fill="rgba(51,51,51,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-translate.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M20 5h-9.12L10 2H4c-1.1 0-2 .9-2 2v13c0 1.1.9 2 2 2h7l1 3h8c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zM7.17 14.59c-2.25 0-4.09-1.83-4.09-4.09s1.83-4.09 4.09-4.09c1.04 0 1.99.37 2.74 1.07l.07.06-1.23 1.18-.06-.05c-.29-.27-.78-.59-1.52-.59-1.31 0-2.38 1.09-2.38 2.42s1.07 2.42 2.38 2.42c1.37 0 1.96-.87 2.12-1.46H7.08V9.91h3.95l.01.07c.04.21.05.4.05.61 0 2.35-1.61 4-3.92 4zm6.03-1.71c.33.6.74 1.18 1.19 1.7l-.54.53-.65-2.23zm.77-.76h-.99l-.31-1.04h3.99s-.34 1.31-1.56 2.74a9.18 9.18 0 0 1-1.13-1.7zM21 20c0 .55-.45 1-1 1h-7l2-2-.81-2.77.92-.92L17.79 18l.73-.73-2.71-2.68c.9-1.03 1.6-2.25 1.92-3.51H19v-1.04h-3.64V9h-1.04v1.04h-1.96L11.18 6H20c.55 0 1 .45 1 1v13z" fill="rgba(51,51,51,1)"></path>
+    </g>
+  </svg>

+ 6 - 0
src/assets/icon/sidebar-video.svg

@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48" width="24" height="24" style="" filter="none">
+    
+    <g>
+    <path d="M39 6H9C7.34315 6 6 7.34315 6 9V39C6 40.6569 7.34315 42 9 42H39C40.6569 42 42 40.6569 42 39V9C42 7.34315 40.6569 6 39 6Z" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M20.5 28V21.9378L25.75 24.9689L31 28L25.75 31.0311L20.5 34.0622V28Z" fill="none" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6 15H42" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M33 6L27 15" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path><path d="M21 6L15 15" stroke="rgba(51,51,51,1)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"></path>
+    </g>
+  </svg>

+ 277 - 64
src/components/CommonPreview.vue

@@ -100,8 +100,8 @@
         <aside v-if="!sidebarShow" class="sidebar-bar">
           <aside class="toolbar">
             <div class="toolbar-special">
-              <!-- <img :src="require('@/assets/icon/sidebar-fullscreen.png')" alt="全屏" />
-              <img :src="require('@/assets/icon/sidebar-toolkit.png')" alt="工具箱" /> -->
+              <img :src="require('@/assets/icon/sidebar-fullscreen.png')" alt="全屏" @click="fullScreen" />
+              <img :src="require('@/assets/icon/sidebar-toolkit.png')" alt="工具箱" />
               <img :src="require(`@/assets/icon/arrow-down.png`)" alt="伸缩" @click="toggleSidebarShow" />
             </div>
           </aside>
@@ -120,17 +120,17 @@
           </div>
           <div v-if="sidebarShow" class="toolbar-list">
             <div
-              v-for="{ icon, title, handle, param } in sidebarIconList"
+              v-for="{ icon, title, handle, param, children } in sidebarIconList"
               :key="icon"
               :class="['sidebar-item', { active: curToolbarIcon === icon }]"
               :title="title"
-              @click="handleSidebarClick(handle, param, icon)"
+              @click="handleSidebarClick(handle, param, icon, children)"
             >
               <div
                 class="sidebar-icon icon-mask"
                 :style="{
                   backgroundColor: curToolbarIcon === icon ? '#fff' : '#1E2129',
-                  maskImage: `url(${require(`@/assets/icon/sidebar-${icon}.png`)})`,
+                  maskImage: `url(${require(`@/assets/icon/sidebar-${icon}.svg`)})`,
                 }"
               ></div>
             </div>
@@ -168,43 +168,115 @@
               </el-table>
             </div>
           </div>
-          <template v-if="curToolbarIcon === 'audit'">
-            <AuditRemark :remark-list="remark_list" :is-audit="isShowAudit" @deleteRemarks="deleteRemarks" />
-          </template>
-          <div v-if="['image', 'audio', 'video'].includes(curToolbarIcon)" class="resource_box">
-            <h5>{{ drawerTitle }}</h5>
+          <!-- <div v-if="curToolbarIcon === 'totalResources'" class="resource_box"></div> -->
+          <div v-if="['image', 'audio', 'video'].includes(twoCurToolbarIcon)" class="resource_box">
+            <div class="source-toolbar-list">
+              <div
+                v-for="{ icon, title, handle, param } in twoSidebarList"
+                :key="icon"
+                :class="['sidebar-item', { active: twoCurToolbarIcon === icon }]"
+                :title="title"
+                @click="handleSidebarClick(handle, param, icon, '', 2)"
+              >
+                <div
+                  class="sidebar-icon icon-mask"
+                  :style="{
+                    backgroundColor: twoCurToolbarIcon === icon ? '#fff' : '#1E2129',
+                    maskImage: `url(${require(`@/assets/icon/sidebar-${icon}.svg`)})`,
+                  }"
+                ></div>
+              </div>
+            </div>
             <div style="height: 40px"></div>
-            <ul
-              v-infinite-scroll="loadMore"
-              class="scroll-container"
-              infinite-scroll-disabled="disabled"
-              :infinite-scroll-immediate="false"
-            >
-              <li
-                v-for="(item, index) in file_list"
-                :key="index"
-                class="list-item"
-                @click="handleFileClick(item?.courseware_id, item?.component_id)"
+
+            <el-collapse v-model="activeBookChapterId" accordion @change="multimediaHandleChange">
+              <el-collapse-item
+                v-for="chapter in bookChapterList"
+                :key="chapter.id"
+                :name="chapter.id"
+                :title="chapter.name"
               >
-                <template v-if="parseInt(drawerType) === 0">
-                  <el-image :src="item.file_url" fit="contain" />
-                </template>
-                <template v-else-if="parseInt(drawerType) === 1">
-                  <AudioPlay
-                    view-size="middle"
-                    :file-id="item.file_id"
-                    :file-name="item.file_name.slice(0, item.file_name.lastIndexOf('.'))"
-                    :show-slider="true"
-                    :audio-index="index"
-                  />
-                </template>
-                <template v-else-if="parseInt(drawerType) === 2">
-                  <VideoPlay view-size="small" :file-id="item.file_id" :video-index="index" />
-                </template>
+                <!-- 加载状态 -->
+                <div v-if="multimediaLoadingStates" class="loading-text">加载中...</div>
+
+                <!-- 加载完成显示数据 -->
+                <div v-else-if="chapter.data">
+                  <ul class="scroll-container" infinite-scroll-disabled="disabled" :infinite-scroll-immediate="false">
+                    <li
+                      v-for="(item, index) in chapter.data"
+                      :key="`${chapter.id}-${index}`"
+                      class="list-item"
+                      @click="handleFileClick(item?.courseware_id, item?.component_id)"
+                    >
+                      <template v-if="parseInt(drawerType) === 0">
+                        <el-image v-if="shouldShowItem(chapter, item)" :src="item.file_url" fit="contain" />
+                        <div class="mark">
+                          <span class="word">{{ item.file_name }}</span>
+                          <el-link
+                            type="primary"
+                            class="el-icon-place linkLocation"
+                            @click="handleLocation(item, 3)"
+                          ></el-link>
+                        </div>
+                      </template>
+                      <template v-else-if="parseInt(drawerType) === 1">
+                        <AudioPlay
+                          v-if="shouldShowItem(chapter, item)"
+                          view-size="middle"
+                          :file-id="item.file_id"
+                          :file-name="item.file_name.slice(0, item.file_name.lastIndexOf('.'))"
+                          :show-slider="true"
+                          :audio-index="index"
+                        />
+                        <div class="mark">
+                          <span class="word"></span>
+                          <el-link
+                            type="primary"
+                            class="el-icon-place linkLocation"
+                            @click="handleLocation(item, 3)"
+                          ></el-link>
+                        </div>
+                      </template>
+                      <template v-else-if="parseInt(drawerType) === 2">
+                        <VideoPlay
+                          v-if="shouldShowItem(chapter, item)"
+                          view-size="small"
+                          :file-id="item.file_id"
+                          :video-index="index"
+                        />
+                        <div class="mark">
+                          <span class="word">{{ item.file_name }}</span>
+                          <el-link
+                            type="primary"
+                            class="el-icon-place linkLocation"
+                            @click="handleLocation(item, 3)"
+                          ></el-link>
+                        </div>
+                      </template>
+                    </li>
+                  </ul>
+                </div>
+
+                <!-- 加载失败或未加载 -->
+                <div v-else class="error-text">没有资源</div>
+              </el-collapse-item>
+            </el-collapse>
+          </div>
+
+          <div v-if="curToolbarIcon === 'collect'" class="resource_box">
+            <h5>{{ drawerTitle }}</h5>
+            <div style="height: 40px"></div>
+            <ul v-if="allCottectList.length > 0" class="card-box">
+              <li v-for="item in allCottectList" :key="item.id">
+                <span class="el-icon-notebook-2"> 原文</span>
+                <span>{{ item.text }}</span>
+                <div>
+                  <el-button type="text" class="el-icon-delete" @click="handDelCollect(item.id)"> 删除</el-button>
+                  <el-divider direction="vertical" />
+                  <el-button type="text" class="el-icon-place" @click="handleLocation(item, 2)"> 定位</el-button>
+                </div>
               </li>
             </ul>
-            <p v-if="loading">加载中...</p>
-            <p v-if="noMore">没有更多了</p>
           </div>
           <div v-if="curToolbarIcon === 'note'" class="resource_box">
             <h5>{{ drawerTitle }}</h5>
@@ -215,7 +287,7 @@
                 <span>{{ item.text }}</span>
                 <el-divider class="mt10" />
                 <span v-html="item.note"></span>
-                <div class="remark-bottom">
+                <div>
                   <el-button type="text" class="el-icon-edit" @click="handEditNote(item)"> 编辑</el-button>
                   <el-divider direction="vertical" />
                   <el-button type="text" class="el-icon-delete" @click="handDelNote(item.id)"> 删除</el-button>
@@ -225,21 +297,9 @@
               </li>
             </ul>
           </div>
-          <div v-if="curToolbarIcon === 'collect'" class="resource_box">
-            <h5>{{ drawerTitle }}</h5>
-            <div style="height: 40px"></div>
-            <ul v-if="allCottectList.length > 0" class="card-box">
-              <li v-for="item in allCottectList" :key="item.id">
-                <span class="el-icon-notebook-2"> 原文</span>
-                <span>{{ item.text }}</span>
-                <div class="remark-bottom">
-                  <el-button type="text" class="el-icon-delete" @click="handDelCollect(item.id)"> 删除</el-button>
-                  <el-divider direction="vertical" />
-                  <el-button type="text" class="el-icon-place" @click="handleLocation(item, 2)"> 定位</el-button>
-                </div>
-              </li>
-            </ul>
-          </div>
+          <template v-if="curToolbarIcon === 'audit'">
+            <AuditRemark :remark-list="remark_list" :is-audit="isShowAudit" @deleteRemarks="deleteRemarks" />
+          </template>
         </div>
 
         <div class="back-top" @click="backTop">
@@ -280,6 +340,7 @@
         @child-click="handleNodeClick"
       />
     </el-dialog>
+
     <el-dialog
       title=""
       :visible="visibleVisNetwork"
@@ -327,6 +388,7 @@ import {
   ChapterGetBookChapterStructExpandList,
   GetBookBaseInfo,
   MangerGetBookMindMap,
+  GetBookChapterStructExpandList,
   PageQueryBookResourceList,
   GetLanguageTypeList,
   GetBookUnifiedAttrib,
@@ -339,6 +401,7 @@ import {
   DeleteMyCollect,
   SearchBookContentText,
 } from '@/api/book';
+import { toggleFullScreen } from '@/utils/common';
 
 export default {
   name: 'CommonPreview',
@@ -385,15 +448,21 @@ export default {
   },
   data() {
     const sidebarIconList = [
-      // { icon: 'search', title: '搜索', handle: '', param: {} },
+      { icon: 'search', title: '搜索', handle: 'getSearch', param: { type: '5' } },
       { icon: 'mindmap', title: '思维导图', handle: 'openMindMap', param: {} },
       { icon: 'knowledge', title: '知识图谱', handle: 'openVisNetwork', param: {} },
-      // { icon: 'totalResources', title: '总资源', handle: '', param: {} },
-      { icon: 'search', title: '搜索', handle: 'getSearch', param: { type: '5' } },
+      {
+        icon: 'totalResources',
+        title: '总资源',
+        handle: '',
+        param: {},
+        children: [
+          { icon: 'audio', title: '音频', handle: 'openDrawer', param: { type: '1' } },
+          { icon: 'image', title: '图片', handle: 'openDrawer', param: { type: '0' } },
+          { icon: 'video', title: '视频', handle: 'openDrawer', param: { type: '2' } },
+        ],
+      },
       { icon: 'collect', title: '收藏', handle: 'getCollect', param: { type: '3' } },
-      { icon: 'audio', title: '音频', handle: 'openDrawer', param: { type: '1' } },
-      { icon: 'image', title: '图片', handle: 'openDrawer', param: { type: '0' } },
-      { icon: 'video', title: '视频', handle: 'openDrawer', param: { type: '2' } },
       { icon: 'note', title: '笔记', handle: 'getNote', param: { type: '4' } },
       // { icon: 'translate', title: '翻译', handle: '', param: {} },
       // { icon: 'setting', title: '设置', handle: '', param: {} },
@@ -444,6 +513,8 @@ export default {
       },
       curToolbarIcon: this.isShowAudit ? 'audit' : '',
       sidebarIconList,
+      twoSidebarList: [],
+      twoCurToolbarIcon: '',
       visibleMindMap: false,
       visibleVisNetwork: false,
       isChildDataLoad: false,
@@ -478,7 +549,10 @@ export default {
       oldRichData: {},
       newSelectedInfo: null,
       allCottectList: [],
+      bookChapterList: [],
       book_id: '',
+      activeBookChapterId: '',
+      multimediaLoadingStates: true,
     };
   },
   computed: {
@@ -501,6 +575,11 @@ export default {
       };
       return titleMap[this.drawerType] || '资源列表';
     },
+    shouldShowItem() {
+      return (chapter, item) => {
+        return this.activeBookChapterId === chapter.id && item && item.file_id;
+      };
+    },
   },
   watch: {
     isJudgeCorrect(newVal) {
@@ -739,11 +818,23 @@ export default {
      * @param {any} param - 处理函数参数
      * @param {string} icon - 图标名称
      */
-    handleSidebarClick(handle, param, icon) {
+    handleSidebarClick(handle, param, icon, children, barLevel) {
       if (typeof handle === 'string' && handle && typeof this[handle] === 'function') {
         this[handle](param);
       }
-      this.curToolbarIcon = icon;
+
+      if (barLevel == 2) {
+        this.twoCurToolbarIcon = icon;
+      } else {
+        this.curToolbarIcon = icon;
+        this.twoCurToolbarIcon = '';
+      }
+
+      if (children && children.length > 0 && Array.isArray(children)) {
+        this.twoSidebarList = children;
+        this.twoCurToolbarIcon = children[0].icon;
+        this.openDrawer(children[0].param);
+      }
     },
     openMindMap() {
       MangerGetBookMindMap({ book_id: this.projectId }).then(({ content }) => {
@@ -771,6 +862,9 @@ export default {
       this.visibleMindMap = false;
       this.visibleVisNetwork = false;
     },
+    /**
+     * 打开知识图谱
+     */
     async openVisNetwork() {
       this.visibleVisNetwork = true;
     },
@@ -785,12 +879,14 @@ export default {
         this.drawerType = '';
         return;
       }
+      this.activeBookChapterId = '';
       // 重置所有加载状态
       this.resetLoadState();
       this.drawerType = type;
       this.$nextTick(() => {
         // 确保DOM更新后触发加载
-        this.loadMore();
+        // this.loadMore();
+        this.loadBookChapterStructExpandList();
       });
     },
     openAudit() {
@@ -804,6 +900,59 @@ export default {
       this.lastLoadTime = 0; // 重置时间戳,允许立即加载
       this.loadCount = 0;
     },
+
+    /**
+     * 加载章节
+     */
+    async loadBookChapterStructExpandList() {
+      const params = {
+        book_id: this.projectId,
+        node_deep_mode: 3, // 节点深度模式 0【全部】,1【只查询章节】2【只查询非叶子章节】3【只查询第一层】
+        is_contain_root_node: 'false', // 是否包含根节点(把教材作为根节点)
+        is_contain_producer: 'false', // 是否包含制作人信息
+        is_contain_auditor: 'false', // 是否包含审核人信息
+      };
+      await GetBookChapterStructExpandList(params).then(({ node_list }) => {
+        this.bookChapterList = node_list || [];
+      });
+    },
+    /**
+     * 加载章节下的资源
+     */
+    async loadmultimediaList() {
+      const params = {
+        page_capacity: this.page_capacity,
+        cur_page: this.cur_page,
+        book_id: this.projectId,
+        book_chapter_node_id: this.activeBookChapterId,
+        type: parseInt(this.drawerType),
+      };
+      await PageQueryBookResourceList(params)
+        .then(({ total_count, resource_list }) => {
+          this.total_count = total_count;
+          this.file_list = resource_list || [];
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+    /**
+     * 点击章节,切换数据
+     */
+    async multimediaHandleChange() {
+      const item = this.bookChapterList.find((item) => item.id === this.activeBookChapterId);
+      if (item) {
+        this.multimediaLoadingStates = true;
+        if (!item.data && !item.error) {
+          await this.loadmultimediaList();
+          let tmpList = this.file_list && this.file_list.length > 0 ? [...this.file_list] : null;
+          this.$set(item, 'data', tmpList);
+          this.multimediaLoadingStates = false;
+        } else {
+          this.multimediaLoadingStates = false;
+        }
+      }
+    },
     // 加载更多数据
     async loadMore() {
       const now = Date.now();
@@ -822,6 +971,7 @@ export default {
         page_capacity: this.page_capacity,
         cur_page: this.cur_page,
         book_id: this.projectId,
+        book_chapter_node_id: this.activeBookChapterId,
         type: parseInt(this.drawerType),
       };
       await PageQueryBookResourceList(params)
@@ -932,6 +1082,7 @@ export default {
         this.handleNodeClick(did);
         return;
       }
+
       if (this.$refs.courserware && this.$refs.courserware.handleLocation) {
         item.type = type;
         this.$refs.courserware.handleLocation(item);
@@ -1122,6 +1273,9 @@ export default {
         }
       });
     },
+    fullScreen() {
+      toggleFullScreen(this.$refs.previewMain);
+    },
   },
 };
 </script>
@@ -1496,6 +1650,31 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
           overflow-y: auto;
           border: 1px solid #e5e5e5;
 
+          .source-toolbar-list {
+            position: fixed;
+            z-index: 999;
+            display: flex;
+            width: 240px;
+            background: #f2f3f5;
+
+            .sidebar-item {
+              width: 100%;
+              padding-top: 5px;
+              text-align: center;
+              border-right: 1px solid #ccc;
+
+              .sidebar-icon {
+                width: 26px;
+                height: 26px;
+                cursor: pointer;
+              }
+
+              &.active {
+                background-color: #4095e5;
+              }
+            }
+          }
+
           h5 {
             position: fixed;
             z-index: 999;
@@ -1514,7 +1693,7 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
             margin: 6px;
 
             .list-item {
-              display: flex;
+              // display: flex;
               align-items: center;
               cursor: pointer;
               border: 1px solid #ccc;
@@ -1562,6 +1741,39 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
               color: grey;
             }
           }
+
+          .mark {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            padding: 3px;
+
+            .word {
+              flex: 1;
+              margin-right: 10px;
+              word-break: break-all;
+            }
+
+            .linkLocation {
+              cursor: pointer;
+            }
+          }
+
+          ::v-deep .el-collapse-item__header {
+            margin-left: 5px;
+          }
+
+          .loading-text {
+            padding: 5px;
+            color: #999;
+            text-align: center;
+          }
+
+          .error-text {
+            padding: 5px;
+            color: #999;
+            text-align: center;
+          }
         }
       }
 
@@ -1586,6 +1798,7 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
   .audio-middle {
     width: 100% !important;
     padding: 6px 8px !important;
+    margin-left: 0;
     border: none;
     border-radius: 8px;
 

Some files were not shown because too many files changed in this diff