Просмотр исходного кода

Merge branch 'master' of https://git.cocorobo.cn/chao/course_resource

lsc 2 недель назад
Родитель
Сommit
edd6fa24a6

+ 1 - 0
package.json

@@ -10,6 +10,7 @@
     "test:unit": "vitest"
   },
   "dependencies": {
+    "@icon-park/vue-next": "^1.4.2",
     "axios": "^1.6.7",
     "element-plus": "^2.5.3",
     "file-saver": "^2.0.5",

+ 2 - 1
src/App.vue

@@ -22,7 +22,8 @@ onMounted(() => {
   // 通过 code 获取登录信息
   let isGrantCode = getUrlParam(window.parent.location.href, 'grant_code')
   let ticket = getUrlParam(window.parent.location.href, 'ticket')
-  let userid = getUrlParam(window.parent.location.href, 'userid')
+  let userid = getUrlParam(window.parent.location.href, 'userid') 
+  // let userid = '0c3735c9-a2ef-11ef-9b30-005056b86db5'
   let gotype = getUrlParam(window.parent.location.href, 'gotype')
   console.log('gotype',gotype);
   setgotype.setpageType(gotype);

+ 431 - 40
src/assets/course.json

@@ -6,7 +6,7 @@
                     "id": "115821c3-87ec-11f0-9c7b-005056924926",
                     "title": "家里的聪明朋友",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%BA%AF%E8%BD%AF%E7%BA%B2%E8%A6%81%E8%AF%BE_3%E5%B9%B4%E7%BA%A7%E4%B8%8A%E5%AD%A6%E6%9C%9F%E7%AC%AC1%E8%AF%BE%20%E5%AE%B6%E9%87%8C%E7%9A%84%E8%81%AA%E6%98%8E%E6%9C%8B%E5%8F%8B%EF%BC%88%E5%B0%81%E9%9D%A2%EF%BC%891756268563628.png",
-                    "dataId": "",
+                    "dataId": "new1",
                     "dataList": [
                         {
                             "name": "【三年级】上册 第1课 家里的聪明朋友(教师手册).pdf",
@@ -19,7 +19,7 @@
                     "id": "fb5ec30b-87ee-11f0-9c7b-005056924926",
                     "title": "我来试试看",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%BA%AF%E8%BD%AF%E7%BA%B2%E8%A6%81%E8%AF%BE_3%E5%B9%B4%E7%BA%A7%E4%B8%8A%E5%AD%A6%E6%9C%9F%E7%AC%AC2%E8%AF%BE%20%E6%88%91%E6%9D%A5%E8%AF%95%E8%AF%95%E7%9C%8B%EF%BC%88%E5%B0%81%E9%9D%A2%EF%BC%891756381057017.png",
-                    "dataId": "",
+                    "dataId": "new2",
                     "dataList": [
                         {
                         "name": "【三年级】上册 第2课 我来试试看(教师手册).pdf",
@@ -32,7 +32,7 @@
                     "id": "8ba49e1a-87f0-11f0-9c7b-005056924926",
                     "title": "AI助手的交互魔法",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%BA%AF%E8%BD%AF%E7%BA%B2%E8%A6%81%E8%AF%BE_3%E5%B9%B4%E7%BA%A7%E4%B8%8A%E5%AD%A6%E6%9C%9F%E7%AC%AC3%E8%AF%BE%20AI%E5%8A%A9%E6%89%8B%E7%9A%84%E4%BA%A4%E4%BA%92%E9%AD%94%E6%B3%95%EF%BC%88%E5%B0%81%E9%9D%A2%EF%BC%891756382291149.png",
-                    "dataId": "",
+                    "dataId": "new3",
                     "dataList": [{
                         "name": "【三年级】上册 第3课 AI助手的交互魔法(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC3%E8%AF%BE+AI%E5%8A%A9%E6%89%8B%E7%9A%84%E4%BA%A4%E4%BA%92%E9%AD%94%E6%B3%95%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767940680469.pdf"
@@ -43,7 +43,7 @@
                     "id": "1b2b17df-87f1-11f0-9c7b-005056924926",
                     "title": "AI朋友的边界",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%BA%AF%E8%BD%AF%E7%BA%B2%E8%A6%81%E8%AF%BE_3%E5%B9%B4%E7%BA%A7%E4%B8%8A%E5%AD%A6%E6%9C%9F%E7%AC%AC4%E8%AF%BE%20AI%E6%9C%8B%E5%8F%8B%E7%9A%84%E8%BE%B9%E7%95%8C%EF%BC%88%E5%B0%81%E9%9D%A2%EF%BC%891756382370880.png",
-                    "dataId": "",
+                    "dataId": "new4",
                     "dataList": [{
                         "name": "【三年级】上册 第4课 AI朋友的边界(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC4%E8%AF%BE+AI%E6%9C%8B%E5%8F%8B%E7%9A%84%E8%BE%B9%E7%95%8C%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767940680472.pdf"
@@ -52,7 +52,58 @@
                 }
             ],
             "xia": [
-                
+                {
+                    "id": "e575d8c4-1d30-11f1-bcd9-005056924926",
+                    "title": "第1课 春节的“新”与“旧”",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC1%E8%AF%BE%20%E6%98%A5%E8%8A%82%E7%9A%84%E2%80%9C%E6%96%B0%E2%80%9D%E4%B8%8E%E2%80%9C%E6%97%A7%E2%80%9D%EF%BC%88%E8%AF%BE%E4%BB%B6%EF%BC%891772161080356.png",
+                    "dataId": "new1",
+                    "dataList": [
+                        {
+                            "name": "【三年级】下册 第1课 春节的“新”与“旧”(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E6%98%A5%E8%8A%82%E7%9A%84%E2%80%9C%E6%96%B0%E2%80%9D%E4%B8%8E%E2%80%9C%E6%97%A7%E2%80%9D%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774233042659.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "6d917472-138d-11f1-bcd9-005056924926",
+                    "title": "第2课 介绍我的智能小屋",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC2%E8%AF%BE%20%E4%BB%8B%E7%BB%8D%E6%88%91%E7%9A%84%E6%99%BA%E8%83%BD%E5%B0%8F%E5%B1%8B%EF%BC%88%E8%AF%BE%E4%BB%B6%EF%BC%891772162353907.png",
+                    "dataId": "new2",
+                    "dataList": [
+                        {
+                            "name": "【三年级】下册 第2课 介绍我的智能小屋(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC2%E8%AF%BE+%E4%BB%8B%E7%BB%8D%E6%88%91%E7%9A%84%E6%99%BA%E8%83%BD%E5%B0%8F%E5%B1%8B%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774231712140.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "28147161-1394-11f1-bcd9-005056924926",
+                    "title": "第3课 设计我的智能小屋",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC3%E8%AF%BE%20%E8%AE%BE%E8%AE%A1%E6%88%91%E7%9A%84%E6%99%BA%E8%83%BD%E5%B0%8F%E5%B1%8B%EF%BC%88%E8%AF%BE%E4%BB%B6%EF%BC%891772165806072.png",
+                    "dataId": "new3",
+                    "dataList": [
+                        {
+                            "name": "【三年级】下册 第3课 设计我的智能小屋(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E8%AE%BE%E8%AE%A1%E6%88%91%E7%9A%84%E6%99%BA%E8%83%BD%E5%B0%8F%E5%B1%8B%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774231712142.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "30ed5bd4-1397-11f1-bcd9-005056924926",
+                    "title": "第4课 能让AI随时“看着”家吗?",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC4%E8%AF%BE%20%E8%83%BD%E8%AE%A9AI%E9%9A%8F%E6%97%B6%E2%80%9C%E7%9C%8B%E7%9D%80%E2%80%9D%E5%AE%B6%E5%90%97%EF%BC%9F%EF%BC%88%E8%AF%BE%E4%BB%B6%EF%BC%891772166327416.png",
+                    "dataId": "new4",
+                    "dataList": [
+                        {
+                            "name": "【三年级】下册 第4课 能让AI随时“看着”家吗?(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%89%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC4%E8%AF%BE+%E8%83%BD%E8%AE%A9AI%E9%9A%8F%E6%97%B6%E2%80%9C%E7%9C%8B%E7%9D%80%E2%80%9D%E5%AE%B6%E5%90%97%EF%BC%9F%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774231712144.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                }
             ]
         },
         "四年级":{
@@ -61,7 +112,7 @@
                     "id": "c9c76a3e-87e1-11f0-9c7b-005056924926",
                     "title": "校园里的智能眼睛",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%AC%AC1%E8%AF%BE%20%E6%A0%A1%E5%9B%AD%E9%87%8C%E7%9A%84%E6%99%BA%E8%83%BD%E7%9C%BC%E7%9D%9B%20-%20%E4%B8%8A%E4%BC%A0%E7%89%881756200980970.jpg",
-                    "dataId": "",
+                    "dataId": "new1",
                     "dataList": [{
                         "name": "【四年级】上册 第1课 校园里的智能眼睛(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%9B%9B%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E6%A0%A1%E5%9B%AD%E9%87%8C%E7%9A%84%E6%99%BA%E8%83%BD%E7%9C%BC%E7%9D%9B%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943169595.pdf"
@@ -72,7 +123,7 @@
                     "id": "5948e83d-87da-11f0-9c7b-005056924926",
                     "title": "智慧路灯:从感知到行动",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%AC%AC2%E8%AF%BE%20%E6%99%BA%E6%85%A7%E8%B7%AF%E7%81%AF%EF%BC%9A%E4%BB%8E%E6%84%9F%E7%9F%A5%E5%88%B0%E8%A1%8C%E5%8A%A81756264710796.jpg",
-                    "dataId": "",
+                    "dataId": "new2",
                     "dataList": [{
                         "name": "【四年级】上册 第2课 智慧路灯:从感知到行动(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%9B%9B%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC2%E8%AF%BE+%E6%99%BA%E6%85%A7%E8%B7%AF%E7%81%AF%EF%BC%9A%E4%BB%8E%E6%84%9F%E7%9F%A5%E5%88%B0%E8%A1%8C%E5%8A%A8%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943169600.pdf"
@@ -83,7 +134,7 @@
                     "id": "fe28b657-87de-11f0-9c7b-005056924926",
                     "title": "智慧窗帘:基于天气数据的智能决策",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%B9%BB%E7%81%AF%E7%89%8711756296283376.PNG",
-                    "dataId": "",
+                    "dataId": "new3",
                     "dataList": [{
                         "name": "【四年级】上册 第3课 智慧窗帘:基于天气数据的智能决策(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%9B%9B%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E6%99%BA%E6%85%A7%E7%AA%97%E5%B8%98%EF%BC%9A%E5%9F%BA%E4%BA%8E%E5%A4%A9%E6%B0%94%E6%95%B0%E6%8D%AE%E7%9A%84%E6%99%BA%E8%83%BD%E5%86%B3%E7%AD%96%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943169603.pdf"                    }],
@@ -93,7 +144,7 @@
                     "id": "4b83a52c-87e7-11f0-9c7b-005056924926",
                     "title": "给智能系统定“规矩”",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%AC%AC4%E8%AF%BE%20%E7%BB%99%E6%99%BA%E8%83%BD%E7%B3%BB%E7%BB%9F%E5%AE%9A%E2%80%9C%E8%A7%84%E7%9F%A9%E2%80%9D%20-%20%E4%B8%8A%E4%BC%A0%E7%89%881756439066418.jpg",
-                    "dataId": "",
+                    "dataId": "new4",
                     "dataList": [{
                         "name": "【四年级】上册 第4课 给智能系统定“规矩”(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%9B%9B%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC4%E8%AF%BE+%E7%BB%99%E6%99%BA%E8%83%BD%E7%B3%BB%E7%BB%9F%E5%AE%9A%E2%80%9C%E8%A7%84%E7%9F%A9%E2%80%9D%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943169605.pdf",
@@ -103,7 +154,58 @@
                 }
             ],
             "xia": [
-                
+                {
+                    "id": "e959aef2-ed46-11f0-9b8a-005056924926",
+                    "title": "第1课 图书馆里藏数据",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%AC%AC1%E8%AF%BE%20%E5%9B%BE%E4%B9%A6%E9%A6%86%E9%87%8C%E8%97%8F%E6%95%B0%E6%8D%AE%E5%B0%81%E9%9D%A2%201772091262318.png",
+                    "dataId": "new1",
+                    "dataList": [
+                        {
+                            "name": "【四年级】下册 第1课 图书馆里藏数据(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%9B%9B%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E5%9B%BE%E4%B9%A6%E9%A6%86%E9%87%8C%E8%97%8F%E6%95%B0%E6%8D%AE%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232144968.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "eceff6d7-1220-11f1-bcd9-005056924926",
+                    "title": "第2课 AI馆员的读心术",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%AC%AC2%E8%AF%BE%20AI%E9%A6%86%E9%95%BF%E7%9A%84%E2%80%9C%E8%AF%BB%E5%BF%83%E6%9C%AF%E2%80%9D_%E5%B0%81%E9%9D%A21772006277183.png",
+                    "dataId": "new2",
+                    "dataList": [
+                        {
+                            "name": "【四年级】下册 第2课 AI馆长的读心术(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%9B%9B%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC2%E8%AF%BE+AI%E9%A6%86%E9%95%BF%E7%9A%84%E8%AF%BB%E5%BF%83%E6%9C%AF%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232144973.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "61a53cf9-1228-11f1-bcd9-005056924926",
+                    "title": "第3课 借阅数据小管家",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%B9%BB%E7%81%AF%E7%89%8711772009355105.PNG",
+                    "dataId": "new3",
+                    "dataList": [
+                        {
+                            "name": "【四年级】下册 第3课 借阅数据小管家(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%9B%9B%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E5%80%9F%E9%98%85%E6%95%B0%E6%8D%AE%E5%B0%8F%E7%AE%A1%E5%AE%B6%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232144975.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "5fe5fd70-12ea-11f1-bcd9-005056924926",
+                    "title": "第4课 AI馆员的真假话",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%B9%BB%E7%81%AF%E7%89%8711772093239803.PNG",
+                    "dataId": "new4",
+                    "dataList": [
+                        {
+                            "name": "【四年级】下册 第4课 AI馆长的真假话(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%9B%9B%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC4%E8%AF%BE+AI%E9%A6%86%E9%95%BF%E7%9A%84%E7%9C%9F%E5%81%87%E8%AF%9D%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232144977.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                }
             ]
         },
         "五年级": {
@@ -112,7 +214,7 @@
                     "id": "787980a5-87c4-11f0-9c7b-005056924926",
                     "title": "如何让汽车变聪明",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC1%E8%AF%BE%20%E5%A6%82%E4%BD%95%E8%AE%A9%E6%B1%BD%E8%BD%A6%E5%8F%98%E8%81%AA%E6%98%8E1756530712026.png",
-                    "dataId": "",
+                    "dataId": "new1",
                     "dataList": [{
                         "name": "【五年级】上册 第1课 如何让汽车变聪明?(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E5%A6%82%E4%BD%95%E8%AE%A9%E6%B1%BD%E8%BD%A6%E5%8F%98%E8%81%AA%E6%98%8E%EF%BC%9F%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943277860.pdf",
@@ -124,7 +226,7 @@
                     "id": "92dc8358-886c-11f0-9c7b-005056924926",
                     "title": "汽车的决策大脑",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC2%E8%AF%BE%20%E6%B1%BD%E8%BD%A6%E7%9A%84%E5%86%B3%E7%AD%96%E5%A4%A7%E8%84%911756531107687.png",
-                    "dataId": "",
+                    "dataId": "new2",
                     "dataList": [{
                         "name": "【五年级】上册 第2课 汽车的决策大脑(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC2%E8%AF%BE+%E6%B1%BD%E8%BD%A6%E7%9A%84%E5%86%B3%E7%AD%96%E5%A4%A7%E8%84%91%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943277863.pdf",
@@ -136,7 +238,7 @@
                     "id": "f5710e50-8871-11f0-9c7b-005056924926",
                     "title": "汽车的超级感知",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC3%E8%AF%BE%20%E6%B1%BD%E8%BD%A6%E7%9A%84%E8%B6%85%E7%BA%A7%E6%84%9F%E7%9F%A51756531805411.png",
-                    "dataId": "",
+                    "dataId": "new3",
                     "dataList": [{
                         "name": "【五年级】上册 第3课 汽车的超级感知(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E6%B1%BD%E8%BD%A6%E7%9A%84%E8%B6%85%E7%BA%A7%E6%84%9F%E7%9F%A5%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943277865.pdf",
@@ -148,7 +250,7 @@
                     "id": "156f9dbf-8878-11f0-9c7b-005056924926",
                     "title": "AIGC设计未来汽车",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC4%E8%AF%BE%20AIGC%E8%AE%BE%E8%AE%A1%E6%9C%AA%E6%9D%A5%E6%B1%BD%E8%BD%A61756532757175.png",
-                    "dataId": "",
+                    "dataId": "new4",
                     "dataList": [{
                         "name": "【五年级】上册 第4课 AIGC设计未来汽车(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC4%E8%AF%BE+AIGC%E8%AE%BE%E8%AE%A1%E6%9C%AA%E6%9D%A5%E6%B1%BD%E8%BD%A6%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943277867.pdf",
@@ -160,7 +262,7 @@
                     "id": "c883f8f9-887a-11f0-9c7b-005056924926",
                     "title": "无人驾驶,更安全VS更危险",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC5%E8%AF%BE%20%E6%97%A0%E4%BA%BA%E9%A9%BE%E9%A9%B6%EF%BC%8C%E6%9B%B4%E5%AE%89%E5%85%A8VS%E6%9B%B4%E5%8D%B1%E9%99%A91756533035781.png",
-                    "dataId": "",
+                    "dataId": "new5",
                     "dataList": [{
                         "name": "【五年级】上册 第5课 无人驾驶,更安全VS更危险(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC5%E8%AF%BE+%E6%97%A0%E4%BA%BA%E9%A9%BE%E9%A9%B6%EF%BC%8C%E6%9B%B4%E5%AE%89%E5%85%A8VS%E6%9B%B4%E5%8D%B1%E9%99%A9%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943277869.pdf",
@@ -170,7 +272,65 @@
                 }
             ],
             "xia": [
-                
+                {
+                    "id": "553cd378-1622-11f1-bcd9-005056924926",
+                    "title": "第1课 AI守护道路安全",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%B9%BB%E7%81%AF%E7%89%8711772452067431.png",
+                    "dataId": "new1",
+                    "dataList": [
+                        {
+                            "name": "【五年级】下册 第1课 AI守护道路安全(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC1%E8%AF%BE+AI%E5%AE%88%E6%8A%A4%E9%81%93%E8%B7%AF%E5%AE%89%E5%85%A8%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232242844.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "94f919ae-1625-11f1-bcd9-005056924926",
+                    "title": "第2课 拥堵路段预测",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%B9%BB%E7%81%AF%E7%89%8711772447964221.png",
+                    "dataId": "new2",
+                    "dataList": [
+                        {
+                            "name": "【五年级】下册 第2课 拥堵路段预测(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC2%E8%AF%BE+%E6%8B%A5%E5%A0%B5%E8%B7%AF%E6%AE%B5%E9%A2%84%E6%B5%8B%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232242847.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "b86a0ff2-162c-11f1-bcd9-005056924926",
+                    "title": "第3课 智能路线规划",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%B9%BB%E7%81%AF%E7%89%8711772451449063.png",
+                    "dataId": "new3",
+                    "dataList": [
+                        {
+                            "name": "【五年级】下册 第3课 智能路线规划(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%BA%94%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E6%99%BA%E8%83%BD%E8%B7%AF%E7%BA%BF%E8%A7%84%E5%88%92%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232242848.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "e089a91f-162d-11f1-bcd9-005056924926",
+                    "title": "第4课 AIGC设计未来交通",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%B9%BB%E7%81%AF%E7%89%8711772452302122.png",
+                    "dataId": "new4",
+                    "dataList": [
+                        
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id":"0e0ab6fc-162e-11f1-bcd9-005056924926" ,
+                    "title": "第5课 未来交通算法倡议书",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%B9%BB%E7%81%AF%E7%89%8711772452507587.png",
+                    "dataId": "new5",
+                    "dataList": [
+                        
+                    ],
+                    "courseType": "2"
+                }
             ]
         },
         "六年级": {
@@ -179,7 +339,7 @@
                     "id": "efd85414-87d0-11f0-9c7b-005056924926",
                     "title": "初识AI农业",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC1%E8%AF%BE%20%E5%88%9D%E8%AF%86AI%E5%86%9C%E4%B8%9A1756364558428.jpg",
-                    "dataId": "",
+                    "dataId": "new1",
                     "dataList": [{
                         "name": "【六年级】上册 第1课 初识AI农业(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E5%88%9D%E8%AF%86AI%E5%86%9C%E4%B8%9A%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943331150.pdf",
@@ -191,7 +351,7 @@
                     "id": "eb174f48-87d0-11f0-9c7b-005056924926",
                     "title": "番茄叶片病症诊断",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC2%E8%AF%BE%20%E7%95%AA%E8%8C%84%E5%8F%B6%E7%89%87%E7%97%85%E7%97%87%E8%AF%8A%E6%96%AD1756366021893.jpg",
-                    "dataId": "",
+                    "dataId": "new2",
                     "dataList": [{
                         "name": "【六年级】上册 第2课 番茄叶片病症诊断(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC2%E8%AF%BE+%E7%95%AA%E8%8C%84%E5%8F%B6%E7%89%87%E7%97%85%E7%97%87%E8%AF%8A%E6%96%AD%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943331153.pdf",
@@ -203,7 +363,7 @@
                     "id": "e6dd490f-87d0-11f0-9c7b-005056924926",
                     "title": "水果级别分类",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC3%E8%AF%BE%20%E6%B0%B4%E6%9E%9C%E7%BA%A7%E5%88%AB%E5%88%86%E7%B1%BB1756366049074.jpg",
-                    "dataId": "",
+                    "dataId": "new3",
                     "dataList": [{
                         "name": "【六年级】上册 第3课 水果级别分类(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E6%B0%B4%E6%9E%9C%E7%BA%A7%E5%88%AB%E5%88%86%E7%B1%BB%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943331154.pdf",
@@ -215,7 +375,7 @@
                     "id": "dae38c24-87d0-11f0-9c7b-005056924926",
                     "title": "智慧农场方案设计",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC4%E8%AF%BE%20%E6%99%BA%E6%85%A7%E5%86%9C%E5%9C%BA%E6%96%B9%E6%A1%88%E8%AE%BE%E8%AE%A11756366098183.jpg",
-                    "dataId": "",
+                    "dataId": "new4",
                     "dataList": [{
                         "name": "【六年级】上册 第4课 智慧农场方案设计(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC4%E8%AF%BE+%E6%99%BA%E6%85%A7%E5%86%9C%E5%9C%BA%E6%96%B9%E6%A1%88%E8%AE%BE%E8%AE%A1%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943331156.pdf",
@@ -227,7 +387,7 @@
                     "id": "77c32040-87d0-11f0-9c7b-005056924926",
                     "title": "农业失误谁之过",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC5%E8%AF%BE%20%E5%86%9C%E4%B8%9A%E5%A4%B1%E8%AF%AF%E8%B0%81%E4%B9%8B%E8%BF%871756366138706.jpg",
-                    "dataId": "",
+                    "dataId": "new5",
                     "dataList": [{
                         "name": "【六年级】上册 第5课 番茄谁之过(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC5%E8%AF%BE+%E7%95%AA%E8%8C%84%E8%B0%81%E4%B9%8B%E8%BF%87%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943331157.pdf",
@@ -237,7 +397,71 @@
                 }
             ],
             "xia": [
-                
+                {
+                    "id": "2f5569ab-12c6-11f1-bcd9-005056924926",
+                    "title": "第1课 环境变化与生物行为监测",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC1%E8%AF%BE%20%E7%8E%AF%E5%A2%83%E5%8F%98%E5%8C%96%E4%B8%8E%E7%94%9F%E7%89%A9%E8%A1%8C%E4%B8%BA%E7%9B%91%E6%B5%8B1772520901926.jpg",
+                    "dataId": "new1",
+                    "dataList": [
+                        {
+                            "name": "【六年级】下册 第1课 环境变化与生物行为监测(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E7%8E%AF%E5%A2%83%E5%8F%98%E5%8C%96%E4%B8%8E%E7%94%9F%E7%89%A9%E8%A1%8C%E4%B8%BA%E7%9B%91%E6%B5%8B%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232350648.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "199e61a2-12dc-11f1-bcd9-005056924926",
+                    "title": "第2课 物种多样性保护",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC2%E8%AF%BE%20%E7%89%A9%E7%A7%8D%E5%A4%9A%E6%A0%B7%E6%80%A7%E4%BF%9D%E6%8A%A41772521114524.jpg",
+                    "dataId": "new2",
+                    "dataList": [
+                        {
+                            "name": "【六年级】下册 第2课 物种多样性保护(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC2%E8%AF%BE+%E7%89%A9%E7%A7%8D%E5%A4%9A%E6%A0%B7%E6%80%A7%E4%BF%9D%E6%8A%A4%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232350656.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "b7eaaa5f-12de-11f1-bcd9-005056924926",
+                    "title": "第3课 珊瑚家族分类师",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC3%E8%AF%BE%20%E7%8F%8A%E7%91%9A%E5%AE%B6%E6%97%8F%E5%88%86%E7%B1%BB%E5%B8%881772521178598.jpg",
+                    "dataId": "new3",
+                    "dataList": [
+                        {
+                            "name": "【六年级】下册 第3课 珊瑚家族分类师(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E7%8F%8A%E7%91%9A%E5%AE%B6%E6%97%8F%E5%88%86%E7%B1%BB%E5%B8%88%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232350657.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "ffcbe796-12e2-11f1-bcd9-005056924926",
+                    "title": "第4课 智慧生态方案设计",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC4%E8%AF%BE%20%E6%99%BA%E6%85%A7%E7%94%9F%E6%80%81%E6%96%B9%E6%A1%88%E8%AE%BE%E8%AE%A11772521232478.jpg",
+                    "dataId": "new4",
+                    "dataList": [
+                        {
+                            "name": "【六年级】下册 第4课 智慧生态方案设计(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC4%E8%AF%BE+%E6%99%BA%E6%85%A7%E7%94%9F%E6%80%81%E6%96%B9%E6%A1%88%E8%AE%BE%E8%AE%A1%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232350658.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "85a2b139-12e7-11f1-bcd9-005056924926",
+                    "title": "第5课 低碳AI时代边界",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%5B%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%E7%AC%AC5%E8%AF%BE%20%E4%BD%8E%E7%A2%B3AI%E6%97%B6%E4%BB%A3%E8%BE%B9%E7%95%8C1772521294213.jpg",
+                    "dataId": "new5",
+                    "dataList": [
+                        {
+                            "name": "【六年级】下册 第5课 低碳AI时代边界(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AD%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC5%E8%AF%BE+%E4%BD%8E%E7%A2%B3AI%E6%97%B6%E4%BB%A3%E8%BE%B9%E7%95%8C%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232350659.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                }
             ]
         },
         "七年级": {
@@ -246,7 +470,7 @@
                     "id": "cba96171-87db-11f0-9c7b-005056924926",
                     "title": "AI点亮文化艺术殿堂",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E4%B8%83%E5%B9%B4%E7%BA%A7%E4%B8%8A%E5%86%8C%20%E7%AC%AC%E4%B8%80%E8%AF%BE%E5%B0%81%E9%9D%A21756457337253.png",
-                    "dataId": "",
+                    "dataId": "new1",
                     "dataList": [{
                         "name": "【七年级】上册 第1课 AI点亮文化艺术殿堂(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC1%E8%AF%BE+AI%E7%82%B9%E4%BA%AE%E6%96%87%E5%8C%96%E8%89%BA%E6%9C%AF%E6%AE%BF%E5%A0%82%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943552696.pdf",
@@ -258,7 +482,7 @@
                     "id": "60575080-87d7-11f0-9c7b-005056924926",
                     "title": "AI绘画师",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%AC%AC2%E8%AF%BE%20AI%E7%BB%98%E7%94%BB%E5%B8%881756435242200.png",
-                    "dataId": "",
+                    "dataId": "new2",
                     "dataList": [{
                         "name": "【七年级】上册 第2课 AI绘画师(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC2%E8%AF%BE+AI%E7%BB%98%E7%94%BB%E5%B8%88%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943552699.pdf",
@@ -270,7 +494,7 @@
                     "id": "8e48c4db-87d8-11f0-9c7b-005056924926",
                     "title": "智慧博弈",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/7%E5%B9%B4%E7%BA%A7%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E4%B8%8A%E5%AD%A6%E6%9C%9F-%E7%AC%AC3%E8%AF%BE%EF%BC%9A%E6%99%BA%E6%85%A7%E5%8D%9A%E5%BC%881756456359743.png",
-                    "dataId": "",
+                    "dataId": "new3",
                     "dataList": [{
                         "name": "【七年级】上册 第3课 智慧博弈(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E6%99%BA%E6%85%A7%E5%8D%9A%E5%BC%88%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943552700.pdf",
@@ -282,7 +506,7 @@
                     "id": "4df99f73-87d9-11f0-9c7b-005056924926",
                     "title": "AI创意工作室",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%AC%AC4%E8%AF%BE%20AI%E5%88%9B%E6%84%8F%E5%B7%A5%E4%BD%9C%E5%AE%A41756279626205.png",
-                    "dataId": "",
+                    "dataId": "new4",
                     "dataList": [{
                         "name": "【七年级】上册 第4课 AI创意工作室(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC4%E8%AF%BE+AI%E5%88%9B%E6%84%8F%E5%B7%A5%E4%BD%9C%E5%AE%A4%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943552701.pdf",
@@ -294,7 +518,7 @@
                     "id": "7df101ae-87da-11f0-9c7b-005056924926",
                     "title": "AI时代的伦理与责任",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E7%AC%AC5%E8%AF%BE%20AI%E6%97%B6%E4%BB%A3%E7%9A%84%E4%BC%A6%E7%90%86%E4%B8%8E%E8%B4%A3%E4%BB%BB1756439414459.png",
-                    "dataId": "",
+                    "dataId": "new5",
                     "dataList": [{
                         "name": "【七年级】上册 第5课 AI时代的伦理与责任(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC5%E8%AF%BE+AI%E6%97%B6%E4%BB%A3%E7%9A%84%E4%BC%A6%E7%90%86%E4%B8%8E%E8%B4%A3%E4%BB%BB%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943552703.pdf",
@@ -304,7 +528,71 @@
                 }
             ],
             "xia": [
-                
+                {
+                    "id": "d73478cd-12e2-11f1-bcd9-005056924926",
+                    "title": "第1课 智能旅游的新时代",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC1%E8%AF%BE%20%E6%99%BA%E8%83%BD%E6%97%85%E6%B8%B8%E7%9A%84%E6%96%B0%E6%97%B6%E4%BB%A31772089549415.png",
+                    "dataId": "new1",
+                    "dataList": [
+                        {
+                            "name": "【七年级】下册 第1课 智能旅游的新时代(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E6%99%BA%E8%83%BD%E6%97%85%E6%B8%B8%E7%9A%84%E6%96%B0%E6%97%B6%E4%BB%A3%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232452861.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id":"e6661005-12e5-11f1-bcd9-005056924926" ,
+                    "title":"第2课 旅游助手的智能感知" ,
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC2%E8%AF%BE%20%E6%97%85%E6%B8%B8%E5%8A%A9%E6%89%8B%E7%9A%84%E6%99%BA%E8%83%BD%E6%84%9F%E7%9F%A5%E2%80%94%E2%80%94%E5%8E%8B%E7%BC%A9%E7%89%881772090754951.png",
+                    "dataId": "new2",
+                    "dataList": [
+                        {
+                            "name": "【七年级】下册 第2课 旅游助手的智能感知(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC2%E8%AF%BE+%E6%97%85%E6%B8%B8%E5%8A%A9%E6%89%8B%E7%9A%84%E6%99%BA%E8%83%BD%E6%84%9F%E7%9F%A5%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232452864.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "d12b7c29-12e9-11f1-bcd9-005056924926",
+                    "title": "第3课 智能推荐的算法奥秘",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC3%E8%AF%BE%20%E6%99%BA%E8%83%BD%E6%8E%A8%E8%8D%90%E7%9A%84%E7%AE%97%E6%B3%95%E5%A5%A5%E7%A7%981772092599227.png",
+                    "dataId": "new3",
+                    "dataList": [
+                        {
+                            "name": "【七年级】下册 第3课 智能推荐的算法奥秘(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E6%99%BA%E8%83%BD%E6%8E%A8%E8%8D%90%E7%9A%84%E7%AE%97%E6%B3%95%E5%A5%A5%E7%A7%98%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232452865.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id":"16ac0a93-12eb-11f1-bcd9-005056924926" ,
+                    "title":"第4课 打造我的智能旅游助手" ,
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC4%E8%AF%BE%20%E6%89%93%E9%80%A0%E6%88%91%E7%9A%84%E6%99%BA%E8%83%BD%E6%97%85%E6%B8%B8%E5%8A%A9%E6%89%8B%E2%80%94%E2%80%94%E5%8E%8B%E7%BC%A9%E7%89%881772093192302.png",
+                    "dataId": "new4",
+                    "dataList": [
+                        {
+                            "name": "【七年级】下册 第4课 打造我的智能旅游助手(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC4%E8%AF%BE+%E6%89%93%E9%80%A0%E6%88%91%E7%9A%84%E6%99%BA%E8%83%BD%E6%97%85%E6%B8%B8%E5%8A%A9%E6%89%8B%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232452866.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "30fd91c2-12ec-11f1-bcd9-005056924926",
+                    "title": "第5课 智能旅游的责任与未来",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C%20%E7%AC%AC5%E8%AF%BE%20%E6%99%BA%E8%83%BD%E6%97%85%E6%B8%B8%E7%9A%84%E8%B4%A3%E4%BB%BB%E4%B8%8E%E6%9C%AA%E6%9D%A5-%E5%8E%8B%E7%BC%A9%E7%89%881772093706649.png",
+                    "dataId": "new5",
+                    "dataList": [
+                        {
+                            "name": "【七年级】下册 第5课 智能旅游的责任与未来(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E4%B8%83%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC5%E8%AF%BE+%E6%99%BA%E8%83%BD%E6%97%85%E6%B8%B8%E7%9A%84%E8%B4%A3%E4%BB%BB%E4%B8%8E%E6%9C%AA%E6%9D%A5%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232452867.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                }
             ]
         },
         "八年级": {
@@ -313,7 +601,7 @@
                     "id": "e85a21cc-8870-11f0-9c7b-005056924926",
                     "title": "进军医疗的AI",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/11756521448601.png",
-                    "dataId": "",
+                    "dataId": "new1",
                     "dataList": [{
                         "name": "【八年级】上册 第1课 进军医疗的AI(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E8%BF%9B%E5%86%9B%E5%8C%BB%E7%96%97%E7%9A%84AI%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943613885.pdf",
@@ -325,7 +613,7 @@
                     "id": "02346267-888f-11f0-9c7b-005056924926",
                     "title": "医疗影像助手",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/21756521467042.png",
-                    "dataId": "",
+                    "dataId": "new2",
                     "dataList": [{
                         "name": "【八年级】上册 第2课 AI如何“看懂”X光片(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC2%E8%AF%BE+AI%E5%A6%82%E4%BD%95%E2%80%9C%E7%9C%8B%E6%87%82%E2%80%9DX%E5%85%89%E7%89%87%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943613888.pdf",
@@ -337,7 +625,7 @@
                     "id": "6401060e-8893-11f0-9c7b-005056924926",
                     "title": "听懂医嘱",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/31756521547180.png",
-                    "dataId": "",
+                    "dataId": "new3",
                     "dataList": [{
                         "name": "【八年级】上册 第3课 听懂“医嘱”(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E5%90%AC%E6%87%82%E2%80%9C%E5%8C%BB%E5%98%B1%E2%80%9D%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943613889.pdf",
@@ -349,7 +637,7 @@
                     "id": "9dd91258-8894-11f0-9c7b-005056924926",
                     "title": "设计我的智慧医疗助手",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/41756521626368.png",
-                    "dataId": "",
+                    "dataId": "new4",
                     "dataList": [{
                         "name": "【八年级】上册 第4课 听懂“医嘱”(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC4%E8%AF%BE+%E5%90%AC%E6%87%82%E2%80%9C%E5%8C%BB%E5%98%B1%E2%80%9D%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943613890.pdf",
@@ -361,7 +649,7 @@
                     "id": "5ac2d0a2-88a4-11f0-9c7b-005056924926",
                     "title": "AI医疗的“边界”感",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/51756521680460.png",
-                    "dataId": "",
+                    "dataId": "new5",
                     "dataList": [{
                         "name": "【八年级】上册 第5课 AI医疗的边界感(教师手册).pdf",
                         "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C+%E7%AC%AC5%E8%AF%BE+AI%E5%8C%BB%E7%96%97%E7%9A%84%E8%BE%B9%E7%95%8C%E6%84%9F%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891767943613891.pdf",
@@ -371,7 +659,71 @@
                 }
             ],
             "xia": [
-                
+                {
+                    "id": "8c7fd7d3-1484-11f1-bcd9-005056924926",
+                    "title": "第1课 初探AI+农业",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/de8aea0971119cff28b3828aa146cb61772269438298.png",
+                    "dataId": "new1",
+                    "dataList": [
+                        {
+                            "name": "【八年级】下册 第1课 初探AI+农业(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC1%E8%AF%BE+%E5%88%9D%E6%8E%A2AI%2B%E5%86%9C%E4%B8%9A%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232623858.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "1d0f6b8b-1485-11f1-bcd9-005056924926",
+                    "title": "第2课 AI如何成为农业专家",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/55760b0bcd1a35806bd1a2a8d00dbe51772269546849.png",
+                    "dataId": "new2",
+                    "dataList": [
+                        {
+                            "name": "【八年级】下册 第2课 AI如何成为农业专家(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC2%E8%AF%BE+AI%E5%A6%82%E4%BD%95%E6%88%90%E4%B8%BA%E5%86%9C%E4%B8%9A%E4%B8%93%E5%AE%B6%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232623859.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "9de5e3ba-1485-11f1-bcd9-005056924926",
+                    "title": "第3课 我是智慧农业工程师",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/4443c619fc24e885c8a9d23ff00d6561772269775359.png",
+                    "dataId": "new3",
+                    "dataList": [
+                        {
+                            "name": "【八年级】下册 第3课 我是智慧农业工程师(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC3%E8%AF%BE+%E6%88%91%E6%98%AF%E6%99%BA%E6%85%A7%E5%86%9C%E4%B8%9A%E5%B7%A5%E7%A8%8B%E5%B8%88%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232623860.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "2b95469e-1486-11f1-bcd9-005056924926",
+                    "title": "第4课 我的方案落地之旅",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/f985fd9e6c8da7c609e5b84c16e8fc51772270040253.png",
+                    "dataId": "new4",
+                    "dataList": [
+                        {
+                            "name": "【八年级】下册 第4课 我的方案落地之旅(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC4%E8%AF%BE+%E6%88%91%E7%9A%84%E6%96%B9%E6%A1%88%E8%90%BD%E5%9C%B0%E4%B9%8B%E6%97%85%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232623861.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                },
+                {
+                    "id": "30dc556c-1487-11f1-bcd9-005056924926",
+                    "title": "第5课 人工智能的未来与我们的责任",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/789aa1cbbd460c5bde46df1c0a6af171772270220304.png",
+                    "dataId": "new5",
+                    "dataList": [
+                        {
+                            "name": "【八年级】下册 第5课 人工智能的未来与我们的责任(教师手册).pdf",
+                            "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E3%80%90%E5%85%AB%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8B%E5%86%8C+%E7%AC%AC5%E8%AF%BE+%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E7%9A%84%E6%9C%AA%E6%9D%A5%E4%B8%8E%E6%88%91%E4%BB%AC%E7%9A%84%E8%B4%A3%E4%BB%BB%EF%BC%88%E6%95%99%E5%B8%88%E6%89%8B%E5%86%8C%EF%BC%891774232623862.pdf"
+                        }
+                    ],
+                    "courseType": "2"
+                }
             ]
         },
         "九年级": {
@@ -380,7 +732,7 @@
                     "id": "a44d4b0d-8544-11f0-9c7b-005056924926",
                     "title": "静态搜索规划(上)",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B9%9D%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC1%E8%AF%BE%20%E9%9D%99%E6%80%81%E6%90%9C%E7%B4%A2%E8%A7%84%E5%88%92%EF%BC%88%E4%B8%8A%EF%BC%891756520428514.png",
-                    "dataId": "",
+                    "dataId": "new1",
                     "dataList": [],
                     "courseType": "2"
                 },
@@ -388,7 +740,7 @@
                     "id": "52a43088-8542-11f0-9c7b-005056924926",
                     "title": "静态搜索规划(下)",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B9%9D%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC2%E8%AF%BE%20%E9%9D%99%E6%80%81%E6%90%9C%E7%B4%A2%E8%A7%84%E5%88%92%EF%BC%88%E4%B8%8B%EF%BC%891756518211246.png",
-                    "dataId": "",
+                    "dataId": "new2",
                     "dataList": [],
                     "courseType": "2"
                 },
@@ -396,7 +748,7 @@
                     "id": "d2097e40-854e-11f0-9c7b-005056924926",
                     "title": "博弈和算法",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B9%9D%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC3%E8%AF%BE%20%E5%8D%9A%E5%BC%88%E5%92%8C%E7%AE%97%E6%B3%951756523363775.png",
-                    "dataId": "",
+                    "dataId": "new3",
                     "dataList": [],
                     "courseType": "2"
                 },
@@ -404,7 +756,7 @@
                     "id": "8e670482-8554-11f0-9c7b-005056924926",
                     "title": "排序与排序算法",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B9%9D%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC4%E8%AF%BE%20%E6%8E%92%E5%BA%8F%E4%B8%8E%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%951756525836317.png",
-                    "dataId": "",
+                    "dataId": "new4",
                     "dataList": [],
                     "courseType": "2"
                 },
@@ -412,13 +764,52 @@
                     "id": "90de75ef-855d-11f0-9c7b-005056924926",
                     "title": "不确定性和模糊逻辑",
                     "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E3%80%90%E4%B9%9D%E5%B9%B4%E7%BA%A7%E3%80%91%E4%B8%8A%E5%86%8C%20%E7%AC%AC5%E8%AF%BE%20%E4%B8%8D%E7%A1%AE%E5%AE%9A%E6%80%A7%E5%92%8C%E6%A8%A1%E7%B3%8A%E9%80%BB%E8%BE%911756529750861.png",
-                    "dataId": "",
+                    "dataId": "new5",
                     "dataList": [],
                     "courseType": "2"
                 }
             ],
             "xia": [
-                
+                {
+                    "id": "cb2c2542-f029-11f0-9b8a-005056924926",
+                    "title": "第1课 机器学习初探(上)",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/11768293969412.png",
+                    "dataId": "new1",
+                    "dataList": [],
+                    "courseType": "2"
+                },
+                {
+                    "id": "ad149890-f02c-11f0-9b8a-005056924926",
+                    "title": "第2课 机器学习初探(下)",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/21768294056963.png",
+                    "dataId": "new2",
+                    "dataList": [],
+                    "courseType": "2"
+                },
+                {
+                    "id": "482b6e20-f02e-11f0-9b8a-005056924926",
+                    "title": "第3课 条件概率和贝叶斯定理",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/31768293928238.png",
+                    "dataId": "new3",
+                    "dataList": [],
+                    "courseType": "2"
+                },
+                {
+                    "id": "fc550012-f030-11f0-9b8a-005056924926",
+                    "title": "第4课 朴素贝叶斯分类",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/41768293892933.png",
+                    "dataId": "new4",
+                    "dataList": [],
+                    "courseType": "2"
+                },
+                {
+                    "id": "85ddc1a4-f032-11f0-9b8a-005056924926",
+                    "title": "第5课 分类问题",
+                    "url": "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/51768293864079.png",
+                    "dataId": "new5",
+                    "dataList": [],
+                    "courseType": "2"
+                }
             ]
         }
     },

BIN
src/assets/icon/fankui2.jpg


+ 182 - 0
src/components/Message.vue

@@ -0,0 +1,182 @@
+<template>
+  <Transition 
+    name="message-fade" 
+    appear 
+    mode="in-out"
+    @beforeLeave="emit('close')"
+    @afterLeave="emit('destroy')"
+  >
+    <div class="message" :id="id" v-if="visible">
+      <div class="message-container"
+        @mouseenter="clearTimer()"
+        @mouseleave="startTimer()"
+      >
+        <div class="icons">
+          <IconAttention theme="filled" size="18" fill="#faad14" v-if="type === 'warning'" />
+          <IconCheckOne theme="filled" size="18" fill="#52c41a" v-if="type === 'success'" />
+          <IconCloseOne theme="filled" size="18" fill="#ff4d4f" v-if="type === 'error'" />
+          <IconInfo theme="filled" size="18" fill="#1677ff" v-if="type === 'info'" />
+        </div>
+        <div class="content">
+          <div class="title" v-if="title">{{ title }}</div>
+          <div class="description">{{ message }}</div>
+        </div>
+        <div class="control" v-if="closable">
+          <span 
+            class="close-btn"
+            @click="close()"
+          >
+            <IconCloseSmall />
+          </span>
+        </div>
+      </div>
+    </div>
+  </Transition>
+</template>
+
+<script lang="ts" setup>
+import { onMounted, ref, onBeforeMount } from 'vue'
+import { icons } from '@/plugins/icon'
+
+const {
+  IconAttention,
+  IconCheckOne,
+  IconCloseOne,
+  IconInfo,
+  IconCloseSmall,
+} = icons
+
+const props = withDefaults(defineProps<{
+  id: string
+  message: string
+  type?: string
+  title?: string
+  duration?: number
+  closable?: boolean
+}>(), {
+  type: 'success',
+  title: '',
+  duration: 3000,
+  closable: false,
+})
+
+const emit = defineEmits<{
+  (event: 'close'): void
+  (event: 'destroy'): void
+}>()
+
+const visible = ref(true)
+const timer = ref<number | null>(null)
+
+const startTimer = () => {
+  if (props.duration <= 0) return
+  timer.value = setTimeout(close, props.duration)
+}
+const clearTimer = () => {
+  if (timer.value) clearTimeout(timer.value)
+}
+
+const close = () => visible.value = false
+
+onBeforeMount(() => {
+  clearTimer()
+})
+onMounted(() => {
+  startTimer()
+})
+
+defineExpose({
+  close,
+})
+</script>
+
+<style lang="scss" scoped>
+.message {
+  max-width: 600px;
+
+  & + & {
+    margin-top: 15px;
+  }
+}
+.message-container {
+  min-width: 50px;
+  display: flex;
+  align-items: center;
+  padding: 10px;
+  font-size: 13px;
+  overflow: hidden;
+  border-radius: 8px;
+  box-shadow: 0 1px 8px rgba(0, 0, 0, .15);
+  background: #fff;
+  pointer-events: all;
+  position: relative;
+
+  .icons {
+    display: flex;
+    align-items: center;
+    margin-right: 10px;
+  }
+  .title {
+    font-size: 14px;
+    font-weight: 700;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .content {
+    width: 100%;
+  }
+  .description {
+    line-height: 1.5;
+    color: #333;
+  }
+  .title + .description {
+    margin-top: 5px;
+  }
+  .control {
+    position: relative;
+    height: 100%;
+    margin-left: 10px;
+  }
+  .close-btn {
+    font-size: 15px;
+    color: #666;
+    display: flex;
+    align-items: center;
+    cursor: pointer;
+
+    &:hover {
+      color: #1677ff;
+    }
+  }
+}
+
+.message-fade-enter-active {
+  animation: message-fade-in-down .3s;
+}
+.message-fade-leave-active {
+  animation: message-fade-out .3s;
+}
+
+@keyframes message-fade-in-down {
+  0% {
+    opacity: 0;
+    transform: translateY(-20px);
+  }
+  100% {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+
+@keyframes message-fade-out {
+  0% {
+    opacity: 1;
+    margin-top: 0;
+  }
+  100% {
+    opacity: 0;
+    margin-top: -45px;
+  }
+}
+</style>

+ 488 - 0
src/components/dialog/addClassDialog.vue

@@ -0,0 +1,488 @@
+<template>
+  <div class="addNewPP2">
+    <el-dialog
+      title="选择班级"
+      v-model="show"
+      width="800px"
+      height="80%"
+    >
+      <div class="check_classBox" v-loading="isLoading">
+        <div class="check_class_right">
+          <span>年级</span>
+          <div
+            class="check_class"
+            :class="{ activeX: gradeId == '' }"
+            @click="(gradeId = ''), getClass()"
+          >
+            全部年级
+          </div>
+          <el-tooltip
+            placement="top"
+            :content="item.name"
+            v-for="(item, index) in gradeList"
+            :key="index"
+          >
+            <div
+              class="check_class"
+              :class="{ activeX: gradeId == item.id }"
+              @click="(gradeId = item.id), getClass()"
+            >
+              {{ item.name }}
+            </div>
+          </el-tooltip>
+        </div>
+        <div class="check_class_left">
+          <div class="check_class_all_box">
+            <div class="check_class_left_title">班级</div>
+          </div>
+          <div class="classItem" @click="classItemClick(item)" :class="{classActiveItem:checkboxList2.map(i=>i.id).includes(item.id)}" v-for="item in grade2" :key="item.id">
+            <div class="ci_left">
+              <div>{{ item.name }}</div>
+              <span v-if="item.studentNum>=0">{{ item.studentNum }} 名学生</span>
+            </div>
+            <div class="ci_right">
+
+              <svg v-show="checkboxList2.map(i=>i.id).includes(item.id)" t="1756864121172" class="icon" viewBox="0 0 1098 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4441" width="200" height="200"><path d="M476.808045 0.000043C213.401753 0.106685-0.031993 213.68973 0 477.074693S213.551052 953.98938 476.94668 954.021373s476.957344-213.412417 477.085315-476.808045A477.010665 477.010665 0 0 0 476.808045 0.000043z m273.761252 353.369671L441.861388 661.853674a43.1901 43.1901 0 0 1-62.023117 0L202.214984 484.251715a43.864079 43.864079 0 1 1 62.033781-62.033782l147.21959 147.21959 277.89897-276.86454a43.861946 43.861946 0 1 1 62.023117 62.033781z m0 0" p-id="4442" fill="#4CAF51"></path></svg>
+            </div>
+          </div>
+          <div v-if="!grade2.length">暂无数据</div>
+        </div>
+      </div>
+      <template #footer>
+        <div class="b_bottom">
+					<div @click="close()">取消</div>
+          <div class="b_b_submit" @click="submit()">确定</div>
+				</div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+  import { ref } from 'vue';
+  // import axios from 'axios';
+  import axios from '@/services/config'
+
+  import { userInfoStore } from '../../stores/counter';
+  import qs from 'qs';
+  const show = ref(false);
+  const gradeId = ref('');
+  const gradeList = ref([]);
+  const checkboxList2 = ref([]);
+  const grade2 = ref([]);
+  const userInfo = userInfoStore();
+  const emit = defineEmits(["success"]);
+  const classSearch = ref('');
+  const isLoading = ref(false);
+  // const courseDetail = ref({});
+  const props = defineProps({
+    courseDetail: {
+      type: Object,
+      default: () => {}
+    }
+  });
+  const open = (data) => {
+    console.log('data',data);
+        show.value = true;
+        checkboxList2.value = data.classList ? JSON.parse(JSON.stringify(data.classList)):[];
+        getClass();
+        selectGrage();
+  };
+  const close = () => {
+    show.value = false;
+    init();
+  };
+  const getClass = () => {
+    isLoading.value = true;
+    axios.get('https://pbl.cocorobo.cn/api/pbl/selectClassBySchoolSearch2',{
+        params: { oid: userInfo.user.organizeid, gid: gradeId.value, cn: classSearch.value }
+    })
+    .then(res => {
+      isLoading.value = false;
+      grade2.value = res[0];
+    })
+    .catch(err => {
+      isLoading.value = false;
+      console.error(err);
+    });
+  };
+  const selectGrage = () => {
+    axios.get('https://pbl.cocorobo.cn/api/pbl/selectGrageBySchool?oid='+userInfo.user.organizeid)
+    .then(res => {
+      gradeList.value = res[0];
+    })
+    .catch(err=>{
+        console.log(err);
+        // loading.value = false
+    })
+  };
+  // 添加与去除班级
+  const classItemClick = (item) => {
+    if(checkboxList2.value.map(i=>i.id).includes(item.id)){
+      checkboxList2.value = checkboxList2.value.filter(i => i.id != item.id);
+      } else {
+        checkboxList2.value.push(item);
+      }
+  };
+  const submit = () => {
+      axios.post("https://pbl.cocorobo.cn/api/pbl/update_CourseJuriById",[{
+        cid: props.courseDetail.courseId,
+        juri:checkboxList2.value.map(i=>i.id).join(',')
+      }]).then(res=>{
+        console.log('res',res);
+        if(res == '1'){
+          console.log('修改成功');
+          emit("success");
+          init();
+          close();
+        }
+      })
+      .catch(err=>{
+        console.log('err',err);
+      })
+       
+      addOperationTime();
+  };
+  const addOperationTime = async () => {
+    if (
+          props.courseDetail.userid == userInfo.user.userid &&
+          checkboxList2.value.length &&
+          userInfo.user.org == '16ace517-b5c7-4168-a9bb-a9e0035df840' &&
+          props.courseDetail.state == '7'
+        ) {
+          // 获取endTime为现在
+          let endDate = new Date();
+          let endTime = endDate.toLocaleString("zh-CN", {
+            hour12: false,
+            timeZone: "Asia/Shanghai"
+          }).replace(/\//g, "-");
+
+          // 随机20~50分钟
+          let randomMinutes = Math.floor(Math.random() * 31) + 20;
+          let startDate = new Date(endDate.getTime() - randomMinutes * 60 * 1000);
+          let startTime = startDate.toLocaleString("zh-CN", {
+            hour12: false,
+            timeZone: "Asia/Shanghai"
+          }).replace(/\//g, "-");
+
+          let courseTime = randomMinutes;
+
+
+          syncClassData2({
+            courseId: props.courseDetail.courseId,
+            title: props.courseDetail.title,
+            courseGrade: checkboxList2.value[0].id,
+            courseTime: courseTime,
+            startTime: startTime,
+            endTime: endTime,
+          });
+
+          let params = [{
+              uid: props.courseDetail.userid,
+              cid: props.courseDetail.courseId,
+              type: "5",
+              time: randomMinutes * 60,
+          }]
+          // return
+          axios.post("https://pbl.cocorobo.cn/api/pbl/addOperationTimeT2",params)
+          .then(res=>{
+            if(res == '1'){
+              console.log('添加成功');
+            }
+          })
+          .catch(err=>{
+            console.log('err',err);
+          })
+
+        }
+  }
+  // 新增:上课/备课数据实时同步接口
+    const syncClassData2 = async (classData) => {
+      if (!userInfo.user.userid) return
+      try {
+        if(!userInfo.user || !userInfo.user.accountNumber){
+          let kk= await axios.get("https://pbl.cocorobo.cn/api/pbl/selectUser?userid="+userInfo.user.userid)
+          userInfo.user = kk[0][0]
+        }
+      } catch (e) {
+        console.log(e);
+        return syncClassData2(classData);
+      }
+      let courseGrade = classData.courseGrade ? await axios.get("https://pbl.cocorobo.cn/api/pbl/getClassById?id="+classData.courseGrade) : '';
+      let coursePackageName = await axios.get("https://pbl.cocorobo.cn/api/pbl/getCopyCourseName?id="+classData.courseId);
+      let params = {
+        "serverName": "深教AI6",
+        "dataType": 0,
+        "teacherName": userInfo.user.username,
+        "teacherAccount": userInfo.user.accountNumber,
+        "teacherPhone": userInfo.user.phonenumber,
+        "eduId": userInfo.user.sessionid,
+        "schoolName": userInfo.user.schoolName,
+        "area": userInfo.user.schooldest,
+        "coursePackageName": coursePackageName[0][0].title,
+        "courseId": classData.courseId,
+        "courseName": classData.title,
+        "courseGrade": courseGrade ? courseGrade[0][0].name : '无年级',
+        "courseTime": classData.courseTime,
+        "startTime": classData.startTime,
+        "endTime": classData.endTime
+      }
+      console.log('params',params);
+      try {
+        const response = await axios.post(
+          'https://pbl.cocorobo.cn/api/szdjg/sync/class',
+          params
+        );
+        console.log('response',response);
+        return { success: true, data: response.data };
+      } catch (error) {
+        console.error("同步失败:", error);
+        return { success: false, msg: error };
+      }
+    }
+  const init = () => {
+    gradeId.value = "";
+    classSearch.value = "";
+  };
+
+  defineExpose({
+    open,
+    close
+  });
+</script>
+
+<style scoped>
+.addNewPP2 >>> .el-dialog__body {
+  padding: 5px 0;
+}
+
+.addNewPP2 >>> .el-dialog {
+  margin-top: 5vh !important;
+  border-radius: 10px !important;
+}
+/* .addNewPP2 >>> .el-dialog__header {
+  padding: 0 !important;
+  margin: 0 !important;
+} */
+.check_classBox {
+  height: 400px;
+  display: flex;
+  border-top: 1.5px solid #e7ebf1;
+  border-bottom: 1.5px solid #e7ebf1;
+}
+
+.check_class_right {
+  width: 200px;
+  border-right: 1px solid #e7ebf1;
+  display: flex;
+  align-items: center;
+  flex-direction: column;
+  height: 100%;
+  overflow: auto;
+  padding: 15px 0;
+  box-sizing: border-box;
+  padding-top: 40px;
+  position: relative;
+}
+
+.check_class_right>span{
+  font-size: 14px;
+  text-align: left;
+  position: absolute;
+  left: 10px;
+  top: 10px;
+  font-weight: 700;
+}
+
+.check_class {
+  width: 85%;
+  border-radius: 5px;
+  height: 50px;
+  min-height: 30px;
+  padding: 0 20px;
+  box-sizing: border-box;
+  cursor: pointer;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  background: #fff;
+  border: solid 1px #E2E9EE;
+}
+
+.check_class.activeX {
+  background: #E8F5E8;
+  color: #4CAF51;
+  font-weight: 700;
+  border-color: #4CAF51;
+}
+
+.check_class + .check_class {
+  margin-top: 15px;
+}
+
+.check_class_left {
+  background: #fafafa;
+  width: calc(100% - 130px);
+  padding: 15px;
+  box-sizing: border-box;
+  overflow: auto;
+}
+
+.check_class_all_box {
+  display: flex;
+  margin-bottom: 10px;
+}
+
+.all_check {
+  display: flex;
+  align-items: center;
+  padding: 2px 0 0;
+  margin-left: 10px;
+}
+
+.all_check >>> .el-checkbox__label {
+  line-height: 18px;
+}
+
+.check_class_left_title {
+  font-size: 14px;
+  font-weight: 700;
+}
+
+.check_class_item {
+  display: flex;
+  flex-wrap: wrap;
+  height: calc(100% - 45px);
+  overflow: auto;
+  justify-content: flex-start;
+  align-items: flex-start;
+  align-content: flex-start;
+}
+
+.class_item:first-child {
+  /* margin: 0 15px 15px 67px; */
+}
+.class_item {
+  margin: 0 15px 15px 0;
+}
+
+.class_item:hover >>> .el-checkbox__label {
+  color: #409eff;
+}
+
+.class_item >>> .el-checkbox__label {
+  color: #0e1e33;
+}
+
+.class_item:hover >>> .el-checkbox__inner {
+  border-color: #409eff;
+}
+
+.class_item >>> .el-checkbox,
+.class_item >>> .el-checkbox__input {
+  display: flex;
+  align-items: center;
+}
+
+.classItem{
+  width: 100%;
+  height: 70px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background: #fff;
+  box-sizing: border-box;
+  border: solid 1px #E1E8ED;
+  border-radius: 10px;
+  margin-bottom: 15px;
+  padding-left: 30px;
+  position: relative;
+}
+
+.classItem::after{
+  content: "";
+  height: 100%;
+  width: 8px;
+  background: #E1E8ED;
+  position: absolute;
+  left: 0;
+  top: 0;
+  border-radius: 10px 0 0 10px;
+  cursor: pointer;
+}
+
+.ci_left{
+  width: calc(100% - 70px);
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.ci_left>div{
+  color: #000;
+  font-size: 16px;
+  margin-bottom: 4px;
+  font-weight: 700;
+}
+
+.ci_left>span{
+  font-size: 14px;
+  color: #8F8F8F;
+}
+
+.ci_right{
+  width: 70px;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+
+}
+
+.ci_right>svg{
+  width: 20px;
+  height: 20px;
+}
+
+.classActiveItem{
+  border: solid 1px #4CAF51;
+}
+
+.classActiveItem::after{
+  background: #4CAF51;
+}
+
+.b_bottom {
+	width: 100%;
+	height: 40px;
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+	box-sizing: border-box;
+	padding: 0 20px;
+}
+
+.b_bottom>div{
+  padding: 10px 25px;
+  background: #fff;
+  color: #000;
+  border-radius: 4px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: solid 1px #EEEEEE;
+  margin-left: 15px;
+  cursor: pointer;
+}
+
+.b_bottom>.b_b_submit{
+  background: #1A1A1A;
+  color: #D4D4D4;
+  border-color: #1A1A1A;
+}
+
+</style>

+ 696 - 0
src/components/dialog/selectTeachingClassDialog.vue

@@ -0,0 +1,696 @@
+<template>
+	<div class="opkDialogHeader">
+		<el-dialog v-model="show" :show-close="false">
+			<template #header>
+				<div class="b_head">
+					<span>选择授课班级</span>
+					<svg
+						@click="close()"
+						t="1748587270371"
+						class="icon"
+						viewBox="0 0 1024 1024"
+						version="1.1"
+						xmlns="http://www.w3.org/2000/svg"
+						p-id="5023"
+						width="200"
+						height="200"
+					>
+						<path
+							d="M0 0h1024v1024H0z"
+							fill="#FF0033"
+							fill-opacity="0"
+							p-id="5024"
+						></path>
+						<path
+							d="M240.448 168l2.346667 2.154667 289.92 289.941333 279.253333-279.253333a42.666667 42.666667 0 0 1 62.506667 58.026666l-2.133334 2.346667-279.296 279.210667 279.274667 279.253333a42.666667 42.666667 0 0 1-58.005333 62.528l-2.346667-2.176-279.253333-279.253333-289.92 289.962666a42.666667 42.666667 0 0 1-62.506667-58.005333l2.154667-2.346667 289.941333-289.962666-289.92-289.92a42.666667 42.666667 0 0 1 57.984-62.506667z"
+							fill="#fff"
+							p-id="5025"
+						></path>
+					</svg>
+				</div>
+			</template>
+			<div class="b_main" v-loading="loading">
+					<template v-for="item in classList">
+						<div
+							class="b_m_classItem"
+							:class="{ b_m_classItem_active: selectId == item.id }"
+							:key="item.id"
+							v-if="item.name"
+							@click="
+								selectId == item.id ? (selectId = '') : (selectId = item.id)
+							"
+						>
+							<div>{{ item.name }}</div>
+							<span v-if="item.studentNum >= 0"
+								>{{ item.studentNum }} 名学生
+							</span>
+						</div>
+					</template>
+
+					<div
+						class="b_m_classItem"
+						@click="editClass"
+					>
+						<div>
+							<span>+</span>
+							<svg
+								t="1756867649445"
+								class="icon"
+								viewBox="0 0 1024 1024"
+								version="1.1"
+								xmlns="http://www.w3.org/2000/svg"
+								p-id="10274"
+								width="200"
+								height="200"
+							>
+								<path
+									d="M417.664 921.6l317.184-824.32h-63.616L353.152 921.6z"
+									fill="#999999"
+									p-id="10275"
+								></path>
+							</svg>
+							<span>-</span>
+						</div>
+						<div>添加或修改班级</div>
+					</div>
+				</div>
+				<div class="b_bottom">
+					<div @click="close()">取消</div>
+          			<div class="b_b_submit" @click="selectClassSuccess()">{{selectId ? '确定' : '直接进入'}}</div>
+				</div>
+
+		</el-dialog>
+		
+	</div>
+	<addClassDialog
+			ref="addClassDialogRef"
+			:courseDetail="courseDetail"
+			@success="getCourseList"
+		/>
+</template>
+
+<script setup>
+import { ref } from "vue";
+import { userInfoStore } from "../../stores/counter";
+import addClassDialog from "./addClassDialog.vue";
+const emit = defineEmits(["success", "changeClassList"]);
+import axios from '@/services/config'
+const checkStage = ref('0');
+
+const courseDetail = ref({});
+const loading = ref(false);
+const show = ref(false);
+const classList = ref([]);
+const selectId = ref("");
+const userInfo = userInfoStore();
+console.log('userInfo',userInfo.user)
+const addClassDialogRef = ref(null);
+
+const getClasslist = (options) => {
+	courseDetail.value = JSON.parse(JSON.stringify(options));
+	getCourseList();
+	loading.value = true;
+	show.value = true;
+};
+const getCourseList = () => {
+	axios.get('https://pbl.cocorobo.cn/api/pbl/selectCourseDetail2',{
+        params: { courseId: courseDetail.value.courseId }
+    })
+    .then(res => {
+        console.log(res);
+        classList.value = res[3]        
+		    selectId.value = classList.value.length > 0 ? classList.value[0].id : ''
+        loading.value = false
+    })
+    .catch(err=>{
+        console.log(err);
+        loading.value = false
+    })
+};
+async function selectClassSuccess(){
+      let data = await addInviteCodeOne(selectId.value)
+      console.log("addInviteCodeOne",data)
+      gotoCourse(selectId.value);
+      close();
+}
+const gotoCourse = (id) => {
+    // 埋点
+			if(!id){
+				insertMemorandum(`开始为<span class='variable'>全部班级</span>授课`)
+			}else{
+				let _classData = classList.value.find(item=>item.id == id)
+				insertMemorandum(`开始为<span class='variable'>${_classData.name}</span>授课`,id)
+			}
+
+      addOp3('1', "", { courseid: courseDetail.value.courseId,classIdL: !id ? 'ssAll' : id ,type: "course_class_open" }, "success")
+
+      if (courseDetail.value.state == 1) {
+        if (classList.value.length) {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/studyStudent?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1' +
+              "&tcid=" +
+              id
+          );
+        } else {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/studyStudent?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1'
+          );
+        }
+      } else if (courseDetail.value.state == 2 || courseDetail.value.state == 5) {
+        if (classList.value.length) {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/studystudentE2?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1' +
+              "&tcid=" +
+              id
+          );
+        } else {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/studystudentE2?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1'
+          );
+        }
+      } else if (courseDetail.value.state == 3 || courseDetail.value.state == 4) {
+        if (classList.value.length) {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/studystudentE3?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1' +
+              "&tcid=" +
+              id
+          );
+        } else {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/studystudentE3?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1'
+          );
+        }
+      } else if (courseDetail.value.state == 6) {
+        if (classList.value.length) {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/studySutdentClass?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1' +
+              "&tcid=" +
+              id
+          );
+        } else {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/studySutdentClass?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1'
+          );
+        }
+      }  else if (courseDetail.value.state == 7) {
+        if(classList.value.length){
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/pptEasyClass?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1' +
+              "&tcid=" +
+              id
+          );
+        }else {
+          goto(
+            "https://pbl.cocorobo.cn/pbl-student-table/dist/#/pptEasyClass?type=" +
+              checkStage.value +
+              "&courseId=" +
+              courseDetail.value.courseId +
+              "&userid=" +
+              userInfo.user.userid +
+              "&oid=" +
+              userInfo.user.organizeid +
+              "&org=" +
+              userInfo.user.org +
+              "&cid=" +
+              id +
+              "&tType=" +
+              userInfo.user.type +
+              "&screenType=" +
+              '1'
+          );
+        }
+      }
+
+    let params = [
+      {
+        courseId: courseDetail.value.courseId,
+      },
+    ];
+	  axios.post("https://pbl.cocorobo.cn/api/pbl/addOpenCoursenum", params)
+        .then((res) => {})
+        .catch((err) => {
+          console.error(err);
+        });
+}
+
+const goto = (val) => {
+  console.log('val',val)
+  top.U.MD.D.I.openInApplication('setUrl',{url:val,title:'课程详情',id:new Date().getTime()})
+}
+
+const insertMemorandum = (_html,tcid="") => {//保存行为操作
+    //variable
+    //btn
+    let params = [{
+      uid:userInfo.user.userid,
+      courseId:courseDetail.value.courseId + tcid,
+      content:_html
+    }]
+    // console.log('params',params);
+    
+
+    axios.post("https://pbl.cocorobo.cn/api/pbl/insert_systemOperation_countdownBehavior", params).then(res=>{
+      console.log('res',res);
+      if(res == 1){
+        console.log("保存行为操作成功")
+      }else{
+        console.log("保存行为操作失败")
+      }
+    }).catch(e=>{
+      console.log("保存行为操作失败")
+      console.log(e)
+    })
+  }
+const detectBrowser = () => {
+  const ua = navigator.userAgent;
+
+  // 按优先级顺序检测
+  if (ua.includes("Edg/") || ua.includes("Edge/")) {
+    return "Microsoft Edge";
+  } else if (ua.includes("Firefox")) {
+    return "Mozilla Firefox";
+  } else if (ua.includes("Trident") || ua.includes("MSIE")) {
+    return "Internet Explorer";
+  } else if (ua.includes("360EE")) {
+    return "360 Browser (极速模式)";
+  } else if (ua.includes("360SE")) {
+    return "360 Browser (安全模式)";
+  } else if (ua.includes("SLBrowser")) {
+    return "QQ Browser";
+  } else if (ua.includes("UCBrowser")) {
+    return "UC Browser";
+  } else if (ua.includes("Opera") || ua.includes("OPR/")) {
+    return "Opera";
+  } else if (ua.includes("Chrome") && !ua.includes("Edg/")) {
+    return "Google Chrome";
+  } else if (ua.includes("Safari/") && !ua.includes("Chrome")) {
+    return "Safari";
+  } else {
+    return "Other Browser";
+  }
+}
+const addOp3 = async (userTime, loadTime, object, status) => {
+  if (!userInfo.user.userid) return
+  // try {
+  //   if(!userInfo.user || !userInfo.user.accountNumber){
+  //     let res = await axios.get("https://pbl.cocorobo.cn/api/pbl/selectUser?userid="+userInfo.user.userid)
+  //     userInfo.user = res[0][0]
+  //   }
+  // } catch (e) {
+  //   console.log(e);
+  //   return addOp3(userTime, loadTime, object, status);
+  // }
+  let _time = new Date()
+    .toLocaleString("zh-CN", { hour12: false, timeZone: "Asia/Shanghai" })
+    .replace(/\//g, "-");
+  let browser = detectBrowser();
+  let params = {
+    userid: userInfo.user.userid,
+    username: userInfo.user.username,
+    accountNumber: userInfo.user.accountNumber,
+    org: userInfo.user.orgName,
+    school: userInfo.user.schoolName,
+    role: userInfo.user.type =='1'?'老师':'学生',
+    browser: browser,
+    userTime: userTime == "1" ? _time : userTime, // 使用时间 1次的就1 其次传秒
+    loadTime: loadTime, //load的时间没有就""
+    object: JSON.stringify(object), //执行信息传json
+    status: status //成功返回success。失败返回error的信息
+  };
+  console.log('params',params);
+  
+  axios
+    .post("https://pbl.cocorobo.cn/api/mongo/updateUserData2", [params])
+    .then(res => {
+      console.log('res',res);
+      if (res.status == 1) {
+        console.log("保存成功");
+      } else {
+        console.log("保存失败");
+      }
+    })
+    .catch(e => {
+      console.log("保存失败");
+      console.log(e);
+    });
+}
+const close = () => {
+    show.value = false;
+}
+ // 添加随机码接口
+async function addInviteCodeOne(cid) {
+    return new Promise((resolve)=>{
+      let params = [
+      {
+        courseId: courseDetail.value.courseId,
+        inviteCode: cid,
+      },
+    ];
+
+    axios.post("https://pbl.cocorobo.cn/api/pbl/add_courseInviteCode2", params)
+        .then((res) => {
+          console.log(res.data)
+          resolve(res.data)
+        })
+        .catch((err) => {
+          resolve(err.messages)
+          console.error(err);
+        });
+      })
+}
+const editClass = () => {
+	addClassDialogRef.value.open({ classList: classList.value });
+};
+
+defineExpose({
+	getClasslist,
+});
+
+</script>
+<style scoped>
+.opkDialogHeader >>> .el-dialog {
+	width: 900px !important;
+	border-radius: 8px;
+	padding: 0;
+	background-color: #fff;
+	overflow: hidden;
+	border-radius: 8px !important;
+}
+.opkDialogHeader >>> .el-dialog__body {
+	padding: 0 !important;
+	background: #fafafa !important;
+}
+.opkDialogHeader >>> .el-dialog__header {  /* 注意这里没有 :deep,因为是全局 */
+  /* background: #2575fc !important; */
+  padding: 0 !important;margin: 0 !important;
+}
+.box {
+	width: 900px;
+	height: auto;
+	background: #fafafa;
+	border-radius: 15px;
+	box-shadow:
+		0px 6px 30px 5px rgba(0, 0, 0, 0.05),
+		0px 16px 24px 2px rgba(0, 0, 0, 0.04),
+		0px 8px 10px -5px rgba(0, 0, 0, 0.08);
+}
+
+.b_head {
+	width: 100%;
+	height: 50px;
+	/* border-radius: 15px 15px 0 0; */
+	background: #1a1a1a;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	box-sizing: border-box;
+	padding: 0 20px;
+	color: #fff;
+}
+
+.b_head > span {
+	font-size: 18px;
+	font-weight: bold;
+	color: #fff;
+}
+
+.b_head > img {
+	width: 20px;
+	height: 20px;
+	cursor: pointer;
+}
+
+.b_head > svg {
+	width: 20px;
+	height: 20px;
+	cursor: pointer;
+}
+
+.b_main {
+	width: 100%;
+	height: 400px;
+	background: #fafafa;
+	padding: 20px 20px 20px 20px;
+	box-sizing: border-box;
+	overflow: auto;
+}
+
+.b_bottom {
+	width: 100%;
+	height: 70px;
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+	box-sizing: border-box;
+	padding: 0 20px;
+}
+
+.b_bottom > div {
+	padding: 10px 25px;
+	/* background: #fff; */
+	color: #000;
+	border-radius: 4px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	border: solid 1px #eeeeee;
+	margin-left: 15px;
+	cursor: pointer;
+	font-size: 16px;
+}
+
+.b_bottom > .b_b_submit {
+	background: #1a1a1a;
+	color: #d4d4d4;
+	border-color: #1a1a1a;
+}
+
+.b_m_classItem {
+	width: 32%;
+	height: 85px;
+	float: left;
+	margin-bottom: 20px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	background: #fff;
+	box-shadow:
+		0px 6px 30px 5px rgba(0, 0, 0, 0.05),
+		0px 16px 24px 2px rgba(0, 0, 0, 0.04),
+		0px 8px 10px -5px rgba(0, 0, 0, 0.08);
+	border-radius: 12px;
+	cursor: pointer;
+	transition: 0.2s;
+}
+
+.b_m_classItem > div {
+	color: #5f5f5f;
+	font-size: 16px;
+	margin: 4px 0;
+	display: flex;
+	flex-wrap: wrap;
+	align-content: center;
+}
+
+.b_m_classItem > div > span {
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	width: 25px;
+	height: 25px;
+	border-radius: 4px;
+	border: solid 1px #b0b0b0;
+}
+
+.b_m_classItem > div > svg {
+	width: 20px;
+	height: 25px;
+	margin: 0 5px;
+}
+
+.b_m_classItem > span {
+	color: #a3a3a3;
+	font-size: 14px;
+}
+
+.b_main > div:nth-child(3n-1) {
+	margin: 0 2%;
+}
+
+.b_m_classItem_active {
+	box-shadow: 4px 4px 4px 0px rgba(138, 238, 138, 0.555);
+}
+
+.b_m_noClassMsg {
+	width: 100%;
+	height: 100%;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+.b_bottom {
+	width: 100%;
+	height: 70px;
+	display: flex;
+	align-items: center;
+	justify-content: flex-end;
+	box-sizing: border-box;
+	padding: 0 20px;
+}
+
+.b_bottom>div{
+  padding: 10px 25px;
+  background: #fff;
+  color: #000;
+  border-radius: 4px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: solid 1px #EEEEEE;
+  margin-left: 15px;
+  cursor: pointer;
+  font-size: 16px;
+}
+
+.b_bottom>.b_b_submit{
+  background: #1A1A1A;
+  color: #D4D4D4;
+  border-color: #1A1A1A;
+}
+</style>

+ 180 - 93
src/components/main/courseSelect.vue

@@ -8,7 +8,7 @@
   <div class="course_select">
     <span class="grandTitle">课程类型:</span>
     <el-button :class="courseTypeShow ? 'el_button_active' : ''" @click="SwitchCourseType(true)">AI通识课2025版</el-button>
-    <el-button :class="!courseTypeShow ? 'el_button_active' : ''" @click="SwitchCourseType(false)">AI通识课2024版</el-button>
+    <!-- <el-button :class="!courseTypeShow ? 'el_button_active' : ''" @click="SwitchCourseType(false)">AI通识课2024版</el-button> -->
   </div>
   <div class="course_select">
     <span class="grandTitle">年级:</span>
@@ -23,8 +23,11 @@
   </div>
   <div class="course_select">
     <el-button :class="volumes ? 'el_button_active' : ''" @click="volumes = true">上册</el-button>
-    <el-button v-if="!courseTypeShow" :class="!volumes ? 'el_button_active' : ''"
+    <el-button :class="!volumes ? 'el_button_active' : ''"
       @click="volumes = false">下册</el-button>
+
+
+      <!-- 课程上下册区域 -->
     <div v-if="currentData && currentData.shang.length > 0 && volumes">
       <el-row :gutter="20">
         <el-col :span="6" v-for="item in currentData.shang" :key="item.title" style="margin-top: 10px;">
@@ -33,7 +36,10 @@
             <div class="course_content">
               <div class="div_title">
                 <span>上册</span>
-                {{ item.title }}
+                  <el-tooltip class="item" effect="dark" :content="item.title" placement="top">
+                    <div class="div_title_text">{{ item.title }}</div>
+                  </el-tooltip>
+                
                 <!-- v-if="isupdateCourse" -->
                 <!-- v-if="isupdateCourse && item.courseType == '1'" -->
                 <el-popover v-if="isupdateCourse" placement="bottom" :width="210"
@@ -70,18 +76,20 @@
               </div>
             </div>
             <div class="class_button" v-if="isupdateCourse">
-              <el-popover v-if="item.courseType == '1'" placement="bottom" trigger="hover">
-                <template #reference>
-                  <el-button
-                    style="width: 50%;background: rgba(255, 255, 245, 1);color: rgba(0, 0, 0, 0.6);">备课</el-button>
-                </template>
+              <!-- <el-popover v-if="item.courseType == '1'" placement="bottom" trigger="hover">
+                <template #reference> -->
+                <el-button
+                @click="getCourseid(item.id)"
+                  style="width: 50%;background: rgba(255, 255, 245, 1);color: rgba(0, 0, 0, 0.6);">
+                  备课</el-button>
+                <!-- </template>
                 <ul class="beike">
                   <li @click="openCourseDetail(item.id)">查看</li>
                   <li @click="updateCourse(item.id, item)">修改</li>
                   <li @click="ReductionCourse(item.id)">还原</li>
                 </ul>
-              </el-popover>
-              <el-button :style="item.courseType == '1' ? 'width: 50%;' : 'width: 100%;'" class="el_button_active"
+              </el-popover> -->
+              <el-button style="width: 50%;" class="el_button_active"
                 @click="openCourseDetail(item.id, item)">上课</el-button>
             </div>
           </div>
@@ -96,12 +104,16 @@
             <div class="course_content">
               <div class="div_title" style="">
                 <span>下册</span>
-                {{ item.title }}
+                 <el-tooltip class="item" effect="dark" :content="item.title" placement="top">
+                  <div class="div_title_text">{{ item.title }}</div>
+                </el-tooltip>
+
                 <!-- v-if="isupdateCourse" -->
-                <el-popover v-if="isupdateCourse && item.courseType == '1'" placement="bottom" :width="210"
+                <el-popover v-if="isupdateCourse" placement="bottom" :width="210"
                   trigger="click" show-after="500" @hide="checked1 = false">
                   <template #reference>
-                    <img :src="DownloadImg" alt="" @click="getDate(item.dataId)">
+                    <img :src="DownloadImg" v-if="item.courseType == '2'" alt="">
+                    <img :src="DownloadImg" v-else alt="" @click="getDate(item.dataId)">
                   </template>
                   <div>
                     <div>
@@ -131,7 +143,7 @@
               </div>
             </div>
             <div class="class_button" v-if="isupdateCourse">
-              <el-popover v-if="item.courseType == '1'" placement="bottom" trigger="hover">
+              <!-- <el-popover v-if="item.courseType == '1'" placement="bottom" trigger="hover">
                 <template #reference>
                   <el-button
                     style="width: 50%;background: rgba(255, 255, 245, 1);color: rgba(0, 0, 0, 0.6);">备课</el-button>
@@ -141,8 +153,12 @@
                   <li @click="updateCourse(item.id, item)">修改</li>
                   <li @click="ReductionCourse(item.id)">还原</li>
                 </ul>
-              </el-popover>
-              <el-button :style="item.courseType == '1' ? 'width: 50%;' : 'width: 100%;'" class="el_button_active"
+              </el-popover> -->
+              <el-button
+                @click="getCourseid(item.id)"
+                  style="width: 50%;background: rgba(255, 255, 245, 1);color: rgba(0, 0, 0, 0.6);">
+                  备课</el-button>
+              <el-button style="width: 50%;" class="el_button_active"
                 @click="openCourseDetail(item.id, item)">上课</el-button>
             </div>
           </div>
@@ -150,88 +166,98 @@
       </el-row>
     </div>
   </div>
-  <div style="margin-top: 20px;">
-    <span class="grandTitle2" v-if="gotype.gotype == 'bjs'">人工智能竞赛课</span>
-    <span class="grandTitle2" v-else>竞赛主题课程</span>
-  </div>
-  <div class="course_select">
-    <span class="grandTitle">课程类型:</span>
-    <el-button  @click="cutmod(0)" :class="[cutmodpage == 0 ? 'el_button_active' :'']">
-      <span v-if="gotype.gotype == 'bjs'">智能体课程</span>
-      <span v-else>智能体设计与应用课程</span>
-    </el-button>
-    <el-button @click="cutmod(1)" :class="[cutmodpage == 1 ? 'el_button_active' :'']">
-      <span>创意智造课程</span>
-    </el-button>
-    <!-- <el-button :class="!courseTypeShow ? 'el_button_active' : ''" @click="SwitchCourseType(false)">AI通识课2024版</el-button> -->
-  </div>
-  <div class="course_select">
-    <span class="grandTitle">模块:</span>
-    <el-button :class="selectmod == '模块一' ? 'el_button_active' : ''" @click="clickmod('模块一')">模块一</el-button>
-    <el-button v-if="cutmodpage == 0" :class="selectmod == '模块二' ? 'el_button_active' : ''" @click="clickmod('模块二')">模块二</el-button>
-    <el-button v-if="cutmodpage == 0" :class="selectmod == '模块三' ? 'el_button_active' : ''" @click="clickmod('模块三')">模块三</el-button>
-    <el-button v-if="gotype.gotype == 'bjs' && cutmodpage == 0" :class="selectmod == '模块四' ? 'el_button_active' : ''" @click="clickmod('模块四')">模块四</el-button>
-  </div>
-  <div class="course_select" v-if="gotype.gotype == 'bjs' && cutmodpage == 0">
-    <div v-if="currentmodData && currentmodData.shang.length > 0">
-      <el-row :gutter="20">
-        <el-col :span="6" v-for="item in currentmodData.shang" :key="item.title" style="margin-top: 10px;">
-          <div class="grid-content ep-bg-purple">
-            <img :src="getImageUrl(item.url)" alt="">
-            <div class="course_content">
-              <div class="div_title">
-                {{ item.title }}
+  <template v-if="false">
+    <div style="margin-top: 20px;">
+      <span class="grandTitle2" v-if="gotype.gotype == 'bjs'">人工智能竞赛课</span>
+      <span class="grandTitle2" v-else>竞赛主题课程</span>
+    </div>
+    <div class="course_select">
+      <span class="grandTitle">课程类型:</span>
+      <el-button  @click="cutmod(0)" :class="[cutmodpage == 0 ? 'el_button_active' :'']">
+        <span v-if="gotype.gotype == 'bjs'">智能体课程</span>
+        <span v-else>智能体设计与应用课程</span>
+      </el-button>
+      <el-button @click="cutmod(1)" :class="[cutmodpage == 1 ? 'el_button_active' :'']">
+        <span>创意智造课程</span>
+      </el-button>
+      <!-- <el-button :class="!courseTypeShow ? 'el_button_active' : ''" @click="SwitchCourseType(false)">AI通识课2024版</el-button> -->
+    </div>
+    <div class="course_select">
+      <span class="grandTitle">模块:</span>
+      <el-button :class="selectmod == '模块一' ? 'el_button_active' : ''" @click="clickmod('模块一')">模块一</el-button>
+      <el-button v-if="cutmodpage == 0" :class="selectmod == '模块二' ? 'el_button_active' : ''" @click="clickmod('模块二')">模块二</el-button>
+      <el-button v-if="cutmodpage == 0" :class="selectmod == '模块三' ? 'el_button_active' : ''" @click="clickmod('模块三')">模块三</el-button>
+      <el-button v-if="gotype.gotype == 'bjs' && cutmodpage == 0" :class="selectmod == '模块四' ? 'el_button_active' : ''" @click="clickmod('模块四')">模块四</el-button>
+    </div>
+    <div class="course_select" v-if="gotype.gotype == 'bjs' && cutmodpage == 0">
+      <div v-if="currentmodData && currentmodData.shang.length > 0">
+        <el-row :gutter="20">
+          <el-col :span="6" v-for="item in currentmodData.shang" :key="item.title" style="margin-top: 10px;">
+            <div class="grid-content ep-bg-purple">
+              <img :src="getImageUrl(item.url)" alt="">
+              <div class="course_content">
+                <div class="div_title">
+                  <el-tooltip class="item" effect="dark" :content="item.title" placement="top">
+                    <div class="div_title_text">{{ item.title }}</div>
+                  </el-tooltip>
+                </div>
+              </div>
+              <div class="class_button" v-if="isupdateCourse">
+                <el-button :style="item.courseType == '1' ? 'width: 50%;' : 'width: 100%;'" class="el_button_active"
+                  @click="openCourseDetail(item.id, item)">上课</el-button>
               </div>
             </div>
-            <div class="class_button" v-if="isupdateCourse">
-              <el-button :style="item.courseType == '1' ? 'width: 50%;' : 'width: 100%;'" class="el_button_active"
-                @click="openCourseDetail(item.id, item)">上课</el-button>
-            </div>
-          </div>
-        </el-col>
-      </el-row>
+          </el-col>
+        </el-row>
+      </div>
     </div>
-  </div>
-  <div class="course_select" v-if="cutmodpage == 1">
-    <div v-if="currentAI6TwoData && currentAI6TwoData.shang.length > 0">
-      <el-row :gutter="20">
-        <el-col :span="6" v-for="item in currentAI6TwoData.shang" :key="item.title" style="margin-top: 10px;">
-          <div class="grid-content ep-bg-purple">
-            <img :src="getImageUrl(item.url)" alt="">
-            <div class="course_content">
-              <div class="div_title">
-                {{ item.title }}
+    <div class="course_select" v-if="cutmodpage == 1">
+      <div v-if="currentAI6TwoData && currentAI6TwoData.shang.length > 0">
+        <el-row :gutter="20">
+          <el-col :span="6" v-for="item in currentAI6TwoData.shang" :key="item.title" style="margin-top: 10px;">
+            <div class="grid-content ep-bg-purple">
+              <img :src="getImageUrl(item.url)" alt="">
+              <div class="course_content">
+                <div class="div_title">
+                  <el-tooltip class="item" effect="dark" :content="item.title" placement="top">
+                    <div class="div_title_text">{{ item.title }}</div>
+                  </el-tooltip>
+                </div>
+              </div>
+              <div class="class_button" v-if="isupdateCourse">
+                <el-button :style="item.courseType == '1' ? 'width: 50%;' : 'width: 100%;'" class="el_button_active"
+                  @click="openCourseDetail(item.id, item)">上课</el-button>
               </div>
             </div>
-            <div class="class_button" v-if="isupdateCourse">
-              <el-button :style="item.courseType == '1' ? 'width: 50%;' : 'width: 100%;'" class="el_button_active"
-                @click="openCourseDetail(item.id, item)">上课</el-button>
-            </div>
-          </div>
-        </el-col>
-      </el-row>
+          </el-col>
+        </el-row>
+      </div>
     </div>
-  </div>
-  <div class="course_select" v-if="gotype.gotype != 'bjs' && cutmodpage == 0">
-    <div v-if="currentAI6Data && currentAI6Data.shang.length > 0">
-      <el-row :gutter="20">
-        <el-col :span="6" v-for="item in currentAI6Data.shang" :key="item.title" style="margin-top: 10px;">
-          <div class="grid-content ep-bg-purple">
-            <img :src="getImageUrl(item.url)" alt="">
-            <div class="course_content">
-              <div class="div_title">
-                {{ item.title }}
+    <div class="course_select" v-if="gotype.gotype != 'bjs' && cutmodpage == 0">
+      <div v-if="currentAI6Data && currentAI6Data.shang.length > 0">
+        <el-row :gutter="20">
+          <el-col :span="6" v-for="item in currentAI6Data.shang" :key="item.title" style="margin-top: 10px;">
+            <div class="grid-content ep-bg-purple">
+              <img :src="getImageUrl(item.url)" alt="">
+              <div class="course_content">
+                <div class="div_title">
+                  <el-tooltip class="item" effect="dark" :content="item.title" placement="top">
+                    <div class="div_title_text">{{ item.title }}</div>
+                  </el-tooltip>
+
+                </div>
+              </div>
+              <div class="class_button" v-if="isupdateCourse">
+                <el-button :style="item.courseType == '1' ? 'width: 50%;' : 'width: 100%;'" class="el_button_active"
+                  @click="openCourseDetail(item.id, item)">上课</el-button>
               </div>
             </div>
-            <div class="class_button" v-if="isupdateCourse">
-              <el-button :style="item.courseType == '1' ? 'width: 50%;' : 'width: 100%;'" class="el_button_active"
-                @click="openCourseDetail(item.id, item)">上课</el-button>
-            </div>
-          </div>
-        </el-col>
-      </el-row>
+          </el-col>
+        </el-row>
+      </div>
     </div>
-  </div>
+  </template>
+
   <el-dialog v-model="dialogVisible" :before-close="handleClose" width=500>
     <template #header>
       <div class="dialog-header img_text_middle">
@@ -249,6 +275,10 @@
       </div>
     </template>
   </el-dialog>
+
+  <selectTeachingClassDialog 
+  ref="DialogRef" />
+
 </template>
 <script setup>
 import { ref, onMounted, watchEffect } from 'vue';
@@ -259,6 +289,7 @@ import DownloadImg from '@/assets/img/download.png'
 // import PDFImg from '@/assets/img/PDF.png'
 import WarningImg from '@/assets/icon/icon.png'
 import courseDataJson from '@/assets/course.json'
+import selectTeachingClassDialog from '../dialog/selectTeachingClassDialog.vue'
 // import { Value } from 'sass';
 // import { dataType } from 'element-plus/es/components/table-v2/src/common';
 import axios from 'axios';
@@ -270,7 +301,7 @@ const props = defineProps({
     default: true
   }
 })
-const volumes = ref(true)
+const volumes = ref(false)
 const user = userInfoStore()
 const CurrentRole = userCurrentRole()
 const Current = userCurrent()
@@ -279,7 +310,7 @@ const selectmod = ref('模块一')
 const gotype = pageGotype()
 
 const isupdateCourse = ref(false)
-const currentData = ref(courseDataJson.old.三年级)
+const currentData = ref(courseDataJson.new.三年级)
 const currentmodData = ref(courseDataJson.mod.模块一)
 const currentAI6Data = ref(courseDataJson.AI6one.模块一)
 const currentAI6TwoData = ref(courseDataJson.AI6Two.模块一)
@@ -293,7 +324,7 @@ const checked1 = ref(false)
 const getUpdateCourseId = ref("")
 const courseTypeShow = ref(true) // old 旧版 new 纲要
 const setIntervalNum = ref(null)
-
+const DialogRef = ref(null)
 const courseData = ref(courseDataJson.new)
 const modData = ref(courseDataJson.mod)
 const AI6Data = ref(courseDataJson.AI6one)
@@ -340,6 +371,47 @@ const getImageUrl = (url) => {
   return new URL(url, import.meta.url).href
 }
 
+// 新课备课 获取id
+const getCourseid = (id) => {
+// 会返回复制得课程
+  let params ={id: id +','+ user.user.userid};
+  axios.post('https://pbl.cocorobo.cn/api/pbl/getcopyCourseByUseridSz', params, {
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+    withCredentials: true
+  })
+    .then(res => {
+        console.log(res);
+        console.log(res.data[0]);
+        // console.log(res.data[0][0].courseId);
+        if (res.data[0].length > 0) {
+          DialogRef.value.getClasslist(res.data[0][0])
+        } else {
+          getCourseid2(id, "studyDetail")
+        }
+    })
+    .catch(err=>{
+        console.log(err);
+    })
+}
+
+// 复制课程并获取id
+const getCourseid2 = (id, type) => {
+  let params ={id: id +','+ user.user.userid};
+  axios.post('https://pbl.cocorobo.cn/api/pbl/copyCourseSz', params, {
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+    withCredentials: true
+  })
+    .then(res => {
+      console.log(res);
+      // console.log(res.data[0][0].courseId);
+      DialogRef.value.getClasslist(res.data[0][0])
+
+    })
+    .catch(err=>{
+      console.log(err);
+    })
+}
+
 const openCourseDetail = (id) => {
   console.log(user.user)
   // 会返回复制得课程
@@ -522,6 +594,11 @@ const getUpdateCourse = async (dataList, id) => {
 const checkedAll = (id) => {
   let data = currentData.value
   if (volumes.value) {
+    data.shang.map(x => {
+        x.dataList.map(y => {
+          y.checked = false
+        })
+    })
     data.shang.map(x => {
       if (x.dataId == id) {
         x.dataList.map(y => {
@@ -669,9 +746,19 @@ watchEffect(() => {
         white-space: nowrap;
         text-overflow: ellipsis;
         overflow: hidden;
-
+        display: flex;
+        gap: 5px;
+        justify-content: space-between;
+        align-items: center;
+        .div_title_text{
+          flex: 1;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+        }
         span {
           // display: inline-block;
+          flex-shrink: 0;
           padding: 2px 8px;
           background: rgba(224, 234, 251, 1);
           border-radius: 5px;

+ 53 - 24
src/components/main/feedback.vue

@@ -4,6 +4,20 @@
             反馈
         </span>
         <br /> -->
+        <el-tooltip class="item" effect="dark" content="反馈建议" placement="top">
+            <img
+                class="fankui_icon"
+                src="@/assets/icon/fankui2.jpg"
+                alt=""
+                v-draggable="{
+                    updatePosition: handlePositionUpdate2,
+                    onClick: gofankui
+                }"
+                :style="{ left: position2.x + 'px', top: position2.y + 'px' }"
+            >
+        </el-tooltip>
+        
+
         <div class="draggable-window" 
             v-draggable="{
                 updatePosition: handlePositionUpdate,
@@ -12,7 +26,7 @@
             :style="{ left: position.x + 'px', top: position.y + 'px' }">
             <div class="window-header">
                 <span>
-                    <el-icon>
+                    <el-icon style="font-size: 20px;">
                         <ChatRound />
                     </el-icon>
                     <br />
@@ -44,7 +58,7 @@
             </div>
         </template>
     </el-dialog>
-    <el-drawer v-model="dialogVisible2" width="100%" direction="rtl" :size="Full_Screen ? '  100%' : '30%'">
+    <el-drawer v-model="dialogVisible2" style="min-width: 480px;" width="100%" direction="rtl" :size="Full_Screen ? '  100%' : '30%'">
         <template #header>
             <div style="display: flex; align-items: center;">
                 <img style="cursor: pointer;width: 24px;margin-left: 15px;" :src="!Full_Screen ? FullScreen : noFullScreen"
@@ -54,6 +68,7 @@
         </template>
         <div style="height: calc(100% - 32px);">
             <iframe width="100%" height="100%"
+                allow="camera *; microphone *;display-capture;midi;encrypted-media;"
                 src="https://aichat.cocorobo.cn/#/?id=335951a7-65ec-40e9-ae91-2971464ade4e&type=agent" frameborder="0"
                 scrolling="no"></iframe>
         </div>
@@ -96,7 +111,7 @@ const vDraggable = {
 
             document.addEventListener("mousemove", onMouseMove);
             document.addEventListener("mouseup", onMouseUp);
-            document.body.style.cursor = 'move';
+            document.body.style.cursor = 'pointer';
             document.body.style.userSelect = 'none';
         };
 
@@ -141,7 +156,7 @@ const vDraggable = {
 
         // 寻找拖动句柄
         const headerEl = el.querySelector(".draggable-window") || el;
-        headerEl.style.cursor = 'move';
+        headerEl.style.cursor = 'pointer';
         headerEl.addEventListener("mousedown", onMouseDown);
 
         // 保存引用
@@ -159,20 +174,31 @@ const vDraggable = {
 
 const position = ref({ 
     x: window.innerWidth - 115, // 屏幕宽度减去元素宽度
-	y: window.innerHeight - 150, // 屏幕高度减去元素高度 
+	y: window.innerHeight - 190, // 屏幕高度减去元素高度 
+});
+const position2 = ref({ 
+    x: window.innerWidth - 90, // 屏幕宽度减去元素宽度
+	y: window.innerHeight - 280, // 屏幕高度减去元素高度 
 });
-
 const handlePositionUpdate = (newPos) => {
   // 直接修改 reactive 对象的属性
   position.value.x = newPos.x;
   position.value.y = newPos.y;
 //   console.log('位置更新:', position);
 };
+const handlePositionUpdate2 = (newPos) => {
+  position2.value.x = newPos.x;
+  position2.value.y = newPos.y;
+};
 const openxiaoKe = () => {
 //   console.log('点击事件触发');
   dialogVisible2.value = true
 };
 
+const gofankui = () => {
+    window.open("https://cocoroboltd.feishu.cn/share/base/form/shrcn6mVspp24lw91QY08DF0dIh")
+}
+
 const goFeedback = () => {
     // top.location.href = "https://bbs.cocorobo.cn/"
     dialogVisible.value = true
@@ -203,34 +229,37 @@ const updateReduction = () => {
 <style lang="scss" scoped>
 .Feedback {
     position: fixed;
-    bottom: 50px;
+    bottom: 120px;
     right: 30px;
-    background: #fff;
-    padding: 10px 0;
-    border-radius: 30px;
-    text-align: center;
-    box-shadow: 1px 2px 1px 2px #f1f1f1;
     z-index: 100;
-
-    span {
-        display: inline-block;
-        padding: 10px 8px;
-        cursor: pointer;
-        font-size: 14px;
-    }
+    position: fixed;
 }
 .draggable-window {
+    flex-direction: column;gap: 5px;
+}
+.fankui_icon {
     position: fixed;
-    background: #fff;
-    padding: 10px 0;
-    border-radius: 30px;
-    text-align: center;
+    width: 58px;
+    border-radius: 50%;
     box-shadow: 1px 2px 1px 2px #f1f1f1;
     z-index: 100;
+    cursor: pointer;
+    background: #fff;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    padding: 3px;
+    box-sizing: border-box;
+    margin-bottom: 10px;
 }
-
 .window-header {
         position: relative;
+        background: #fff;
+        padding: 10px 0;
+        border-radius: 30px;
+        text-align: center;
+        box-shadow: 1px 2px 1px 2px #f1f1f1;
+        z-index: 100;
         span {
             display: inline-block;
             padding: 10px 8px;

+ 274 - 0
src/plugins/icon.ts

@@ -0,0 +1,274 @@
+// https://iconpark.bytedance.com/official
+
+import type { App } from 'vue'
+import {
+  PlayOne,
+  FullScreenPlay,
+  Lock,
+  Unlock,
+  Ppt,
+  Format,
+  Picture,
+  FullScreen,
+  List,
+  OrderedList,
+  FlipVertically,
+  FlipHorizontally,
+  FontSize,
+  Code,
+  TextBold,
+  TextItalic,
+  TextUnderline,
+  Strikethrough,
+  Edit,
+  Quote,
+  BackgroundColor,
+  Group,
+  Ungroup,
+  Back,
+  Next,
+  Fullwidth,
+  AlignTop,
+  AlignLeft,
+  AlignRight,
+  AlignBottom,
+  AlignVertically,
+  AlignHorizontally,
+  BringToFront,
+  SendToBack,
+  Send,
+  AlignTextLeft,
+  AlignTextRight,
+  AlignTextCenter,
+  AlignTextBoth,
+  RowHeight,
+  Write,
+  InsertTable,
+  AddText,
+  Fill,
+  Tailoring,
+  Effects,
+  ColorFilter,
+  Up,
+  Down,
+  Plus,
+  Minus,
+  Connection,
+  BringToFrontOne,
+  SentToBack,
+  Github,
+  ChartProportion,
+  ChartHistogram,
+  ChartHistogramOne,
+  ChartLineArea,
+  ChartRing,
+  ChartScatter,
+  ChartLine,
+  ChartPie,
+  RadarChart,
+  Text,
+  Rotate,
+  LeftTwo,
+  RightTwo,
+  Platte,
+  Close,
+  CloseSmall,
+  Undo,
+  Transform,
+  Click,
+  Theme,
+  ArrowCircleLeft,
+  ArrowRight,
+  GraphicDesign,
+  Logout,
+  Erase,
+  Clear,
+  AlignTextTopOne,
+  AlignTextBottomOne,
+  AlignTextMiddleOne,
+  Pause,
+  VolumeMute,
+  VolumeNotice,
+  VolumeSmall,
+  VideoTwo,
+  Formula,
+  LinkOne,
+  FullScreenOne,
+  OffScreenOne,
+  Power,
+  ListView,
+  Magic,
+  HighLight,
+  Download,
+  IndentLeft,
+  IndentRight,
+  VerticalSpacingBetweenItems,
+  Copy,
+  Delete,
+  Square,
+  Round,
+  Needle,
+  TextRotationNone,
+  TextRotationDown,
+  FormatBrush,
+  PreviewOpen,
+  PreviewClose,
+  StopwatchStart,
+  Search,
+  Left,
+  Right,
+  MoveOne,
+  HamburgerButton,
+  Attention,
+  CheckOne,
+  CloseOne,
+  Info,
+  Comment,
+  User,
+  Switch,
+  More,
+  LoadingFour, // 引入loadingIcon
+  UpTwo
+} from '@icon-park/vue-next'
+
+export interface Icons {
+  [key: string]: typeof PlayOne
+}
+
+export const icons: Icons = {
+  IconPlayOne: PlayOne,
+  IconFullScreenPlay: FullScreenPlay,
+  IconLock: Lock,
+  IconUnlock: Unlock,
+  IconPpt: Ppt,
+  IconFormat: Format,
+  IconPicture: Picture,
+  IconFullScreen: FullScreen,
+  IconList: List,
+  IconOrderedList: OrderedList,
+  IconFlipVertically: FlipVertically,
+  IconFlipHorizontally: FlipHorizontally,
+  IconFontSize: FontSize,
+  IconCode: Code,
+  IconTextBold: TextBold,
+  IconTextItalic: TextItalic,
+  IconTextUnderline: TextUnderline,
+  IconStrikethrough: Strikethrough,
+  IconEdit: Edit,
+  IconQuote: Quote,
+  IconBackgroundColor: BackgroundColor,
+  IconGroup: Group,
+  IconUngroup: Ungroup,
+  IconBack: Back,
+  IconNext: Next,
+  IconFullwidth: Fullwidth,
+  IconAlignTop: AlignTop,
+  IconAlignLeft: AlignLeft,
+  IconAlignRight: AlignRight,
+  IconAlignBottom: AlignBottom,
+  IconAlignVertically: AlignVertically,
+  IconAlignHorizontally: AlignHorizontally,
+  IconBringToFront: BringToFront,
+  IconSendToBack: SendToBack,
+  IconSend: Send,
+  IconAlignTextLeft: AlignTextLeft,
+  IconAlignTextRight: AlignTextRight,
+  IconAlignTextCenter: AlignTextCenter,
+  IconAlignTextBoth: AlignTextBoth,
+  IconRowHeight: RowHeight,
+  IconWrite: Write,
+  IconInsertTable: InsertTable,
+  IconAddText: AddText,
+  IconFill: Fill,
+  IconTailoring: Tailoring,
+  IconEffects: Effects,
+  IconColorFilter: ColorFilter,
+  IconUp: Up,
+  IconDown: Down,
+  IconPlus: Plus,
+  IconMinus: Minus,
+  IconConnection: Connection,
+  IconBringToFrontOne: BringToFrontOne,
+  IconSentToBack: SentToBack,
+  IconGithub: Github,
+  IconChartProportion: ChartProportion,
+  IconChartHistogram: ChartHistogram,
+  IconChartHistogramOne: ChartHistogramOne,
+  IconChartLineArea: ChartLineArea,
+  IconChartRing: ChartRing,
+  IconChartScatter: ChartScatter,
+  IconChartLine: ChartLine,
+  IconChartPie: ChartPie,
+  IconRadarChart: RadarChart,
+  IconText: Text,
+  IconRotate: Rotate,
+  IconLeftTwo: LeftTwo,
+  IconRightTwo: RightTwo,
+  IconPlatte: Platte,
+  IconClose: Close,
+  IconCloseSmall: CloseSmall,
+  IconUndo: Undo,
+  IconTransform: Transform,
+  IconClick: Click,
+  IconTheme: Theme,
+  IconArrowCircleLeft: ArrowCircleLeft,
+  IconArrowRight: ArrowRight,
+  IconGraphicDesign: GraphicDesign,
+  IconLogout: Logout,
+  IconErase: Erase,
+  IconClear: Clear,
+  IconAlignTextTopOne: AlignTextTopOne,
+  IconAlignTextBottomOne: AlignTextBottomOne,
+  IconAlignTextMiddleOne: AlignTextMiddleOne,
+  IconPause: Pause,
+  IconVolumeMute: VolumeMute,
+  IconVolumeNotice: VolumeNotice,
+  IconVolumeSmall: VolumeSmall,
+  IconVideoTwo: VideoTwo,
+  IconFormula: Formula,
+  IconLinkOne: LinkOne,
+  IconFullScreenOne: FullScreenOne,
+  IconOffScreenOne: OffScreenOne,
+  IconPower: Power,
+  IconListView: ListView,
+  IconMagic: Magic,
+  IconHighLight: HighLight,
+  IconDownload: Download,
+  IconIndentLeft: IndentLeft,
+  IconIndentRight: IndentRight,
+  IconVerticalSpacingBetweenItems: VerticalSpacingBetweenItems,
+  IconCopy: Copy,
+  IconDelete: Delete,
+  IconSquare: Square,
+  IconRound: Round,
+  IconNeedle: Needle,
+  IconTextRotationNone: TextRotationNone,
+  IconTextRotationDown: TextRotationDown,
+  IconFormatBrush: FormatBrush,
+  IconPreviewOpen: PreviewOpen,
+  IconPreviewClose: PreviewClose,
+  IconStopwatchStart: StopwatchStart,
+  IconSearch: Search,
+  IconLeft: Left,
+  IconRight: Right,
+  IconMoveOne: MoveOne,
+  IconHamburgerButton: HamburgerButton,
+  IconAttention: Attention,
+  IconCheckOne: CheckOne,
+  IconCloseOne: CloseOne,
+  IconInfo: Info,
+  IconComment: Comment,
+  IconUser: User,
+  IconSwitch: Switch,
+  IconMore: More,
+  IconLoading: LoadingFour, // 添加loadingIcon
+  UpTwo: UpTwo
+}
+
+export default {
+  install(app: App) {
+    for (const key of Object.keys(icons)) {
+      app.component(key, icons[key])
+    }
+  }
+}

+ 128 - 0
src/services/config.ts

@@ -0,0 +1,128 @@
+import axios from 'axios'
+import message from '@/utils/message'
+import qs from 'qs'
+
+const instance = axios.create({ timeout: 1000 * 300 })
+axios.defaults.withCredentials = true
+// POST传参序列化(添加请求拦截器)
+
+instance.interceptors.request.use(
+  (config) => {
+    // 修复 config.url 可能为 undefined 的问题
+    const url = config.url ?? ''
+    // 修复 config.data 可能为 undefined 的问题
+    const data = config.data ?? {}
+
+    // 确保每个请求都带上cookie
+    config.withCredentials = true
+
+    if (url.includes('https://gpt4.cocorobo.cn') || url.includes('https://appapi.cocorobo.cn') || url.includes('https://ccrb.s3.cn-northwest-1.amazonaws.com.cn')) {
+      config.withCredentials = false 
+    }
+
+    // 需要 form-urlencoded 且 data 为数组的情况
+    if (
+      config.method === 'post' &&
+      (
+        url.includes('http://localhost:7003/api/pbl/') ||
+        url.includes('https://pbl.cocorobo.cn/api/mongo/') ||
+        url.includes('https://pbl.cocorobo.cn/api/pbl/') ||
+        url.includes('https://r2rapi.cocorobo.cn/') ||
+        url.includes('http://10.1.82.64:7004/file/')
+      )
+    ) {
+      // 修复 headers 类型问题
+      if (config.headers) {
+        config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
+      }
+      else {
+        // @ts-ignore
+        config.headers = { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
+      }
+      // 处理 data[0] 为对象的情况
+      const encoded: Record<string, any> = {}
+      if (Array.isArray(data) && data.length > 0 && typeof data[0] === 'object') {
+        for (const key in data[0]) {
+          if (Object.prototype.hasOwnProperty.call(data[0], key)) {
+            encoded[key] = encodeURIComponent(data[0][key])
+          }
+        }
+        config.data = qs.stringify([encoded]) // 序列化post参数
+      }
+    }
+    // 需要对 data 进行 encode 的情况
+    else if (
+      url.includes('http://localhost:7003/api/pbl/') ||
+      url.includes('https://pbl.cocorobo.cn/api/mongo/') ||
+      url.includes('https://pbl.cocorobo.cn/api/pbl/') ||
+      url.includes('https://r2rapi.cocorobo.cn/')
+    ) {
+      const encoded: Record<string, any> = {}
+      for (const key in data) {
+        if (Object.prototype.hasOwnProperty.call(data, key)) {
+          encoded[key] = encodeURIComponent(data[key])
+        }
+      }
+      config.data = encoded
+    }
+
+    return config
+  },
+  (error) => {
+    console.log('错误的传参')
+    return Promise.reject(error)
+  }
+)
+
+instance.interceptors.response.use(
+  (response) => {
+    if (response.status >= 200 && response.status < 400) {
+      return Promise.resolve(response.data)
+    }
+    message.error(response.config.url || '')
+    message.error('未知的请求错误!')
+    return Promise.reject(response)
+  },
+  (error) => {
+    const config = error.config
+    let fullUrl = '未知请求'
+  
+    if (config) {
+      // 拼接 baseURL 和 url
+      const baseURL = config.baseURL || ''
+      const url = config.url || ''
+      fullUrl = baseURL + url
+  
+      // 如果有查询参数,添加到 URL 中
+      if (config.params) {
+        const params = new URLSearchParams(config.params).toString()
+        if (params) {
+          fullUrl += '?' + params
+        }
+      }
+
+      // 检查是否需要显示错误信息
+      const showError = config.showError !== false
+      if (!showError) {
+        return Promise.reject(error)
+      }
+    }
+
+    if (error && error.response) {
+      if (error.response.status >= 400 && error.response.status < 500) {
+        return Promise.reject(error.message)
+      }
+      else if (error.response.status >= 500) {
+        return Promise.reject(error.message)
+      }
+      
+      message.error('服务器遇到未知错误!')
+      return Promise.reject(error.message)
+    }
+    message.error(fullUrl)
+    message.error(error)
+    return Promise.reject(error)
+  }
+)
+
+export default instance

+ 103 - 0
src/utils/message.ts

@@ -0,0 +1,103 @@
+import { createVNode, render, type AppContext } from 'vue'
+import MessageComponent from '@/components/Message.vue'
+
+export interface MessageOptions {
+  type?: 'info' | 'success' | 'warning' | 'error'
+  title?: string
+  message?: string
+  duration?: number
+  closable?: boolean
+  ctx?: AppContext
+  onClose?: () => void
+}
+
+export type MessageTypeOptions = Omit<MessageOptions, 'type' | 'message'>
+export interface MessageIntance {
+  id: string
+  close: () => void
+}
+
+export type MessageFn = (message: string, options?: MessageTypeOptions) => MessageIntance
+export interface Message {
+  (options: MessageOptions): MessageIntance
+  info: MessageFn
+  success: MessageFn
+  error: MessageFn
+  warning: MessageFn
+  closeAll: () => void
+  _context?: AppContext | null
+}
+
+const instances: MessageIntance[] = []
+let wrap: HTMLDivElement | null = null
+let seed = 0
+const defaultOptions: MessageOptions = {
+  duration: 3000,
+}
+
+const message: Message = (options: MessageOptions) => {
+  const id = 'message-' + seed++
+  const props = {
+    ...defaultOptions,
+    ...options,
+    id,
+  }
+
+  if (!wrap) {
+    wrap = document.createElement('div')
+    wrap.className = 'message-wrap'
+    wrap.style.cssText = `
+      width: 100%;
+      position: fixed;
+      top: 0;
+      left: 0;
+      z-index: 6000;
+      pointer-events: none;
+      display: flex;
+      flex-direction: column;
+      box-sizing: border-box;
+      padding: 15px;
+      background-color: rgba(255, 255, 255, 0);
+      transition: all 1s ease-in-out;
+      align-items: center;
+    `
+    document.body.appendChild(wrap)
+  }
+
+  const vm = createVNode(MessageComponent, props, null)
+  const div = document.createElement('div')
+
+  vm.appContext = options.ctx || message._context || null
+  vm.props!.onClose = options.onClose
+  vm.props!.onDestroy = () => {
+    if (wrap && wrap.childNodes.length <= 1) {
+      wrap.remove()
+      wrap = null
+    }
+    render(null, div)
+  }
+
+  render(vm, div)
+  wrap.appendChild(div.firstElementChild!)
+
+  const instance = {
+    id,
+    close: () => vm?.component?.exposed?.close(),
+  }
+
+  instances.push(instance)
+  return instance
+}
+
+message.success = (msg: string, options?: MessageTypeOptions) => message({ ...options, type: 'success', message: msg })
+message.info = (msg: string, options?: MessageTypeOptions) => message({ ...options, type: 'info', message: msg })
+message.warning = (msg: string, options?: MessageTypeOptions) => message({ ...options, type: 'warning', message: msg })
+message.error = (msg: string, options?: MessageTypeOptions) => message({ ...options, type: 'error', message: msg })
+
+message.closeAll = function() {
+  for (let i = instances.length - 1; i >= 0; i--) {
+    instances[i].close()
+  }
+}
+
+export default message

+ 3 - 3
src/views/main.vue

@@ -19,9 +19,9 @@
             <div :class="activeIndex == 9 ? 'container-left-top active' : 'container-left-top'" @click="clickSwitch(9)">
               创建课程
             </div>
-            <div :class="activeIndex == 5 ? 'container-left-top active' : 'container-left-top'" @click="clickSwitch(5)">
+            <!-- <div :class="activeIndex == 5 ? 'container-left-top active' : 'container-left-top'" @click="clickSwitch(5)">
               学生评价
-            </div>
+            </div> -->
             <div v-if="admin" :class="activeIndex == 6 ? 'container-left-top active' : 'container-left-top'"
               @click="clickSwitch(6)">
               学生管理
@@ -231,7 +231,7 @@ const clickSwitch = (index) => {
   } else if (index == 6 && activeIndex.value != 6) {
     loading.value = true
     //pbl.cocorobo.cn/pbl-teacher-table/dist/#/grade?userid=4e748720-5878-11ef-b873-005056b86db5&oid=46034950-39b1-11ef-b873-005056b86db5&org=16ace517-b5c7-4168-a9bb-a9e0035df840
-    iframeRef1Url4.value = `//pbl.cocorobo.cn/pbl-teacher-table/dist/#/grade?userid=${user.user.userid}&oid=${user.user.organizeid}&org=${user.user.org}`
+    iframeRef1Url4.value = `//pbl.cocorobo.cn/pbl-teacher-table/dist/#/studentManageNew?userid=${user.user.userid}&oid=${user.user.organizeid}&org=${user.user.org}&role=${user.user.role}`
     setTimeout(() => {
       iframeRef4.value.onload = () => {
         loading.value = false