Selaa lähdekoodia

Merge branch 'beta'

SanHQin 1 viikko sitten
vanhempi
commit
9f21e31e19
34 muutettua tiedostoa jossa 2516 lisäystä ja 133 poistoa
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.02ffa6f50406d998c9062e6de8bf9c4b.css
  3. 0 0
      dist/static/css/app.02ffa6f50406d998c9062e6de8bf9c4b.css.map
  4. 0 0
      dist/static/css/app.121803fa6bfc7172d54eb656be623934.css
  5. 0 0
      dist/static/css/workPage.9c36eefc62b778744140601830dbd191.css
  6. 0 0
      dist/static/css/workPage.9c36eefc62b778744140601830dbd191.css.map
  7. 0 0
      dist/static/css/workPage.d51f56f9bae42bf970e747d7c63659fa.css
  8. 0 0
      dist/static/css/workPage.d51f56f9bae42bf970e747d7c63659fa.css.map
  9. 0 0
      dist/static/js/app.f078d7b4637efc0c1343.js
  10. 0 0
      dist/static/js/app.f078d7b4637efc0c1343.js.map
  11. 0 0
      dist/static/js/manifest.23ea04dc469b57e2b4f8.js.map
  12. 0 0
      dist/static/js/workPage-manifest.2ece51fa34be51c8610a.js.map
  13. 0 0
      dist/static/js/workPage.55f18d3148666946c188.js
  14. 0 0
      dist/static/js/workPage.55f18d3148666946c188.js.map
  15. 0 0
      dist/static/js/workPage.f64544b287376d5537d1.js
  16. 0 0
      dist/static/js/workPage.f64544b287376d5537d1.js.map
  17. 1 1
      dist/workPage.html
  18. 4 0
      src/App.vue
  19. 1 1
      src/components/common/ConfirmDialog.vue
  20. 337 0
      src/components/common/GradeClassSelector.vue
  21. 10 9
      src/components/pages/contrastObservation/index.vue
  22. 1443 0
      src/components/pages/liyuan/bjspersonTop.vue
  23. 300 0
      src/components/pages/liyuan/page/courseCenter.vue
  24. 135 66
      src/components/pages/pptEasy/addCourse3.vue
  25. 13 6
      src/components/pages/pptEasy/dialog/BilibiliSearchDialog2.vue
  26. 95 0
      src/components/pages/pptEasy/dialog/ToastMessage.vue
  27. 4 4
      src/components/pages/pptEasy/dialog/VideoUploadDialog2.vue
  28. 1 0
      src/components/pages/sassPlatform/view/tableView.vue
  29. 79 21
      src/components/pages/test/checkAi/aiLeader.vue
  30. 1 0
      src/components/pages/testStudent/view/preview.vue
  31. 69 19
      src/components/pages/workPage/components/setChoiceQuestion.vue
  32. 2 2
      src/components/pages/workPage/components/setQuestionsAndAnswers.vue
  33. 2 2
      src/components/pages/workPage/setIndex.vue
  34. 18 1
      src/router/index.js

+ 1 - 1
dist/index.html

@@ -37,7 +37,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.121803fa6bfc7172d54eb656be623934.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.23ea04dc469b57e2b4f8.js></script><script type=text/javascript src=./static/js/vendor.714ff2bfc93f2f096b79.js></script><script type=text/javascript src=./static/js/app.6f9e55d0e9c7c231a7db.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.02ffa6f50406d998c9062e6de8bf9c4b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.23ea04dc469b57e2b4f8.js></script><script type=text/javascript src=./static/js/vendor.714ff2bfc93f2f096b79.js></script><script type=text/javascript src=./static/js/app.f078d7b4637efc0c1343.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/app.02ffa6f50406d998c9062e6de8bf9c4b.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/app.02ffa6f50406d998c9062e6de8bf9c4b.css.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/app.121803fa6bfc7172d54eb656be623934.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/workPage.9c36eefc62b778744140601830dbd191.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/workPage.9c36eefc62b778744140601830dbd191.css.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/workPage.d51f56f9bae42bf970e747d7c63659fa.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/workPage.d51f56f9bae42bf970e747d7c63659fa.css.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/app.f078d7b4637efc0c1343.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/app.f078d7b4637efc0c1343.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/manifest.23ea04dc469b57e2b4f8.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/workPage-manifest.2ece51fa34be51c8610a.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/workPage.55f18d3148666946c188.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/workPage.55f18d3148666946c188.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/workPage.f64544b287376d5537d1.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/workPage.f64544b287376d5537d1.js.map


+ 1 - 1
dist/workPage.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>工作页面 - CocoFlow</title><link rel=icon href=../static/logo.ico><link href=./static/css/workPage.9c36eefc62b778744140601830dbd191.css rel=stylesheet></head><body><noscript><strong>We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script type=text/javascript src=./static/js/workPage-manifest.2ece51fa34be51c8610a.js></script><script type=text/javascript src=./static/js/workPage-vendor.7b2c55096449c94cc8fd.js></script><script type=text/javascript src=./static/js/workPage.55f18d3148666946c188.js></script></body></html><script>function stopSafari() {
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>工作页面 - CocoFlow</title><link rel=icon href=../static/logo.ico><link href=./static/css/workPage.d51f56f9bae42bf970e747d7c63659fa.css rel=stylesheet></head><body><noscript><strong>We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script type=text/javascript src=./static/js/workPage-manifest.2ece51fa34be51c8610a.js></script><script type=text/javascript src=./static/js/workPage-vendor.7b2c55096449c94cc8fd.js></script><script type=text/javascript src=./static/js/workPage.f64544b287376d5537d1.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

+ 4 - 0
src/App.vue

@@ -570,4 +570,8 @@ html::-webkit-scrollbar-thumb {
 .tagOption.selected{
   color: #ef9e28 !important;
 }
+
+.filter-item-option.selected{
+  color: #ff9300;
+}
 </style>

+ 1 - 1
src/components/common/ConfirmDialog.vue

@@ -119,7 +119,7 @@ export default {
 }
 
 .confirm_btn {
-  border-radius: 6px;
+  border-radius: 10px;
   background-color: #FF9400;
   border: none;
   color: #FFFFFF;

+ 337 - 0
src/components/common/GradeClassSelector.vue

@@ -0,0 +1,337 @@
+<template>
+  <div class="grade-class-selector">
+    <div class="form-row">
+      <div class="form-item required" style="width: 100%;">
+        <label class="form-label">{{ lang.ssTeachClass }}</label>
+        <div class="class-selector">
+          <div class="select-input" @click="toggleDropdown">
+            <span class="input" :style="{'color': getSelectedClassName() ? '#303133' : '#c0c4cc'}">{{ getSelectedClassName() || lang.ssSelectClass }}</span>
+            <span class="select-arrow">
+              <svg v-if="!dropdownVisible" t="1776672009773" class="icon" viewBox="0 0 1024 1024" version="1.1"
+                xmlns="http://www.w3.org/2000/svg" p-id="4735" xmlns:xlink="http://www.w3.org/1999/xlink" width="12"
+                height="12">
+                <path
+                  d="M562.5 771c-14.3 14.3-33.7 27.5-52 23.5-18.4 3.1-35.7-11.2-50-23.5L18.8 327.3c-22.4-22.4-22.4-59.2 0-81.6s59.2-22.4 81.6 0L511.5 668l412.1-422.3c22.4-22.4 59.2-22.4 81.6 0s22.4 59.2 0 81.6L562.5 771z"
+                  p-id="4736" fill="#c0c4cc" transform="rotate(180 512 512)"></path>
+              </svg>
+              <svg v-else t="1776672009773" class="icon" viewBox="0 0 1024 1024" version="1.1"
+                xmlns="http://www.w3.org/2000/svg" p-id="4735" xmlns:xlink="http://www.w3.org/1999/xlink" width="12"
+                height="12">
+                <path
+                  d="M562.5 771c-14.3 14.3-33.7 27.5-52 23.5-18.4 3.1-35.7-11.2-50-23.5L18.8 327.3c-22.4-22.4-22.4-59.2 0-81.6s59.2-22.4 81.6 0L511.5 668l412.1-422.3c22.4-22.4 59.2-22.4 81.6 0s22.4 59.2 0 81.6L562.5 771z"
+                  p-id="4736" fill="#c0c4cc"></path>
+              </svg>
+            </span>
+          </div>
+          <div class="dropdown-menu class-dropdown" v-if="dropdownVisible">
+            <div class="dropdown-content">
+              <div class="content-row">
+                <div class="header-item">年级</div>
+                <div class="grade-list">
+                  <div v-for="grade in gradeOptions" :key="grade.id" class="grade-item"
+                    :class="{ active: selectedGrade === grade.id }" @click="selectGrade(grade)">
+                    {{ grade.name }}
+                  </div>
+                </div>
+              </div>
+              <div class="content-row">
+                <div class="header-item">班级</div>
+                <div class="class-list">
+                  <div v-for="classItem in filteredClassOptions" :key="classItem.id" class="class-item"
+                    :class="{ active: selectedClasses.includes(classItem.id) }" @click="toggleClass(classItem.id)">
+                    {{ classItem.name }}
+                  </div>
+                  <div v-if="filteredClassOptions.length === 0" class="no-class">{{ lang.ssNoClass }}</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'GradeClassSelector',
+  props: {
+    gradeOptions: {
+      type: Array,
+      default: () => []
+    },
+    classOptions: {
+      type: Array,
+      default: () => []
+    },
+    value: {
+      type: Array,
+      default: () => []
+    },
+    lang: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      selectedGrade: '',
+      selectedClasses: [],
+      dropdownVisible: false
+    }
+  },
+  computed: {
+    selectedGradeName() {
+      const grade = this.gradeOptions.find(item => item.id === this.selectedGrade);
+      return grade ? grade.name : '';
+    },
+    filteredClassOptions() {
+      if (this.selectedGrade === '') {
+        return this.classOptions;
+      } else {
+        return this.classOptions.filter(item => item.pid === this.selectedGrade);
+      }
+    }
+  },
+  watch: {
+    value: {
+      handler(newVal) {
+        this.selectedClasses = newVal;
+      },
+      immediate: true
+    }
+  },
+  mounted() {
+    // 添加点击外部关闭下拉菜单的事件监听器
+    document.addEventListener('click', this.handleClickOutside);
+  },
+  beforeDestroy() {
+    // 移除事件监听器,避免内存泄漏
+    document.removeEventListener('click', this.handleClickOutside);
+  },
+  methods: {
+    getSelectedClassName() {
+      if (this.selectedClasses.length === 0) {
+        return '';
+      }
+      const names = this.selectedClasses.map(classId => {
+        const classItem = this.classOptions.find(item => item.id === classId);
+        return classItem ? classItem.name : '';
+      }).filter(name => name !== '');
+      return names.join(',');
+    },
+    toggleDropdown() {
+      this.dropdownVisible = !this.dropdownVisible;
+    },
+    selectGrade(grade) {
+      this.selectedGrade = grade.id;
+      // this.selectedClasses = [];
+      // this.$emit('input', this.selectedClasses);
+      this.$emit('gradeChange', this.selectedGrade);
+    },
+    toggleClass(classId) {
+      const index = this.selectedClasses.indexOf(classId);
+      if (index === -1) {
+        this.selectedClasses.push(classId);
+      } else {
+        this.selectedClasses.splice(index, 1);
+      }
+      this.$emit('input', this.selectedClasses);
+    },
+    handleClickOutside(event) {
+      // 检查点击是否发生在下拉菜单外部
+      const classSelector = this.$el.querySelector('.class-selector');
+      if (classSelector && !classSelector.contains(event.target)) {
+        this.dropdownVisible = false;
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.grade-class-selector {
+  width: 100%;
+}
+
+.form-row {
+  display: flex;
+  gap: 15px;
+  width: 100%;
+}
+
+.form-item {
+  flex: 1;
+}
+
+.form-label {
+  display: block;
+  margin-bottom: 8px;
+  font-size: 14px;
+  color: #333;
+}
+
+.grade-selector,
+.class-selector {
+  position: relative;
+  width: 100%;
+}
+
+.select-input {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 8px 30px 8px 12px;
+  border: 1px solid #DCDFE6;
+  border-radius: 4px;
+  cursor: pointer;
+  background-color: #FFFFFF;
+  font-size: 14px;
+  position: relative;
+}
+
+.select-input:hover {
+  border-color: #FF9500;
+}
+
+.select-input .input {
+  width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.select-arrow {
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  right: 12px;
+  font-size: 12px;
+  color: #909399;
+}
+
+.select-arrow svg {
+  width: 12px;
+  height: 12px;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  right: 0;
+  margin-top: 4px;
+  border: 1px solid #DCDFE6;
+  border-radius: 10px;
+  background-color: #FFFFFF;
+  z-index: 1000;
+}
+
+.dropdown-item {
+  padding: 10px 15px;
+  cursor: pointer;
+  font-size: 14px;
+}
+
+.dropdown-item:hover {
+  background-color: #FFF5E6;
+}
+
+.dropdown-item.active {
+  background-color: #FFF5E6;
+  color: #FF9500;
+}
+
+.class-dropdown {
+  width: 100%;
+  max-height: 300px;
+  overflow: auto;
+}
+
+.header-item {
+  height: 42px;
+  line-height: 42px;
+  padding: 0 15px;
+  font-size: 14px;
+  font-weight: bold;
+  background-color: #fafbfc;
+  color: #6b7280;
+}
+
+.dropdown-content {
+  height: 200px;
+  display: flex;
+  padding: 0;
+}
+
+.content-row {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+}
+
+.content-row + .content-row {
+  border-left: 1px solid #E4E7ED;
+}
+
+.grade-list {
+  flex: 1;
+  overflow-y: auto;
+}
+
+.grade-item {
+  padding: 10px 15px;
+  cursor: pointer;
+  font-size: 14px;
+  color: #374151;
+  position: relative;
+}
+
+.grade-item:hover {
+  background-color: #FFF5E6;
+}
+
+.grade-item.active {
+  background-color: #FFF5E6;
+  color: #FF9500;
+}
+
+.grade-item.active::before {
+  content: '';
+  position: absolute;
+  top: 50%;
+  left: 0;
+  width: 3px;
+  height: 85%;
+  transform: translateY(-50%);
+  border-radius: 2px;
+  background-color: #FF9500;
+}
+
+.class-list {
+  flex: 1;
+  overflow-y: auto;
+}
+
+.class-item {
+  padding: 10px 15px;
+  cursor: pointer;
+  font-size: 14px;
+  color: #374151;
+}
+
+.class-item:hover {
+  background-color: #FFF5E6;
+}
+
+.class-item.active {
+  background-color: #FFF5E6;
+  color: #FF9500;
+}
+
+.no-class {
+  padding: 10px 15px;
+  text-align: center;
+  color: #c0c4cc;
+}
+</style>

+ 10 - 9
src/components/pages/contrastObservation/index.vue

@@ -772,10 +772,10 @@ ${this.editorBarData.type == 0 ? this.editorBarData.content : ""}
 						// console.log("👇教师观察👇")
 						// console.log(_jsonData)
 						// console.log("👆教师观察👆")
-						// _jsonData = _jsonData
-						// 	.replaceAll("```json", "")
-						// 	.replaceAll("```", "");
-						// _jsonData.replace(/'/g, '"').replace(/(\w+):/g, '"$1":');
+						_jsonData = _jsonData
+							.replaceAll("```json", "")
+							.replaceAll("```", "");
+						_jsonData.replace(/'/g, '"').replace(/(\w+):/g, '"$1":');
 						let _result = JSON.parse(_jsonData);
 						this.teacherData = _result;
 						resolve();
@@ -1019,10 +1019,10 @@ ${this.editorBarData.type == 0 ? this.editorBarData.content : ""}
 						// console.log("👇AI观察👇")
 						// console.log(_jsonData)
 						// console.log("👆AI观察👆")
-						// _jsonData = _jsonData
-						// 	.replaceAll("```json", "")
-						// 	.replaceAll("```", "");
-						// _jsonData.replace(/'/g, '"').replace(/(\w+):/g, '"$1":');
+						 _jsonData = _jsonData
+							.replaceAll("```json", "")
+							.replaceAll("```", "");
+						 _jsonData.replace(/'/g, '"').replace(/(\w+):/g, '"$1":');
 						let _result = JSON.parse(_jsonData);
 						this.aiData = _result;
 						resolve();
@@ -1209,9 +1209,10 @@ ${_aiWorkText}
 					.then((res) => {
 						let _data = res.data.FunctionResponse.choices[0];
 						let _jsonData = _data.message.content;
-						_jsonData = _jsonData
+					 _jsonData = _jsonData
 							.replaceAll("```json", "")
 							.replaceAll("```", "");
+						 _jsonData.replace(/'/g, '"').replace(/(\w+):/g, '"$1":');
 						let _result = JSON.parse(_jsonData);
 
 						this.contrastData = _result;

+ 1443 - 0
src/components/pages/liyuan/bjspersonTop.vue

@@ -0,0 +1,1443 @@
+<template>
+  <div class="teacherDevelop">
+    <div class="topTalent_container">
+      <div class="topTalent_bg">
+        <div class="topTalent_bg_title">
+          欢迎回来,{{ userInfo.name ? userInfo.name[0] : "" }}老师
+        </div>
+        <div class="topTalent_bg_content">
+          探索潜力,成就未来。拔尖人才选拔与培养系统致力于打造卓越的教育生态,助力创新人才的挖掘与培养,赋能师生共同成长。
+        </div>
+        <div class="topTalent_bg_decor">
+          <div class="topTalent_bg_circle circle_1"></div>
+          <div class="topTalent_bg_circle circle_2"></div>
+        </div>
+      </div>
+      <div>
+        <div style="font-weight: 600;">功能导航</div>
+        <div class="cardBox">
+          <div v-for="item in cardData(cardArray)" :key="item.title" @click="goToPage(item.to)" class="cardItem">
+            <img :src="item.icon" alt="" />
+            <div>{{ item.title }}</div>
+          </div>
+        </div>
+      </div>
+
+
+      <!-- 表单区域 -->
+      <div class="taskContainer">
+        <div class="taskTitle">
+          <div class="taskTitle_left">
+            <span style="font-weight: 600;">评测任务</span>
+            <div class="taskBox">
+              <div
+                @click="getWorks('')"
+                class="taskItem_box"
+                :class="{ taskItem_active: activeId == '' }"
+              >
+                全部
+              </div>
+              <div
+                v-for="(item, index) in tagArrList"
+                :key="index"
+                class="taskItem_box"
+                @click="getWorks(item.id)"
+                :class="{ taskItem_active: item.id == activeId }"
+              >
+                <div class="taskItem">{{ item.name }}</div>
+              </div>
+            </div>
+          </div>
+          <div>共{{ worksArray.length }}项任务</div>
+        </div>
+        <div class="check_box" v-loading="loading">
+          <div
+            class="noneData"
+            v-if="!worksArray.length"
+            style="text-align: center; margin-top: 20px;"
+          >
+            暂无数据
+          </div>
+          <template v-else>
+            <div
+              class="test_panel"
+              v-for="(item, index) in worksArray"
+              :key="index"
+            >
+              <div class="test_panel_title">
+                <div
+                  class="title"
+                  :style="{
+                    paddingLeft:
+                      item.array.length > 0 || item.carray.length > 0
+                        ? '0'
+                        : '30px'
+                  }"
+                  @click="openWork(index)"
+                >
+                  <span
+                    class="open"
+                    :class="{ active: item.open }"
+                    v-if="item.array.length > 0 || item.carray.length > 0"
+                  ></span>
+                  <el-tooltip
+                    :content="item.title"
+                    placement="top"
+                    effect="dark"
+                  >
+                    <span class="titleN">{{ item.title }}</span>
+                  </el-tooltip>
+                </div>
+                <div class="state">
+                  <span
+                    :class="{
+                      is: isOK(item.array) == '已完成',
+                      no: isOK(item.array) == '待办'
+                    }"
+                  >
+                    {{ isOK(item.array) }}
+                    <!-- {{ item.array.length > 0 ? "已完成" : "未完成" }} -->
+                  </span>
+                </div>
+                <div class="time">
+                  <span
+                    v-if="item.overtime"
+                    :class="{ isDead: isDeadlinePassed(item.overtime) }"
+                    >截止时间:{{ item.overtime }}</span
+                  >
+                  <span v-else></span>
+                </div>
+                <div
+                  class="creator"
+                  :style="{
+                    paddingRight: !item.carray.length > 0 ? '0' : '0px'
+                  }"
+                >
+                  <el-tooltip
+                    :content="item.username"
+                    placement="top"
+                    effect="dark"
+                  >
+                    <span>创建者:{{ item.username }}</span>
+                  </el-tooltip>
+                </div>
+                <div
+                  class="editBtn2"
+                  :style="`${item.open ? 'display:flex' : ''}`"
+                  v-if="!item.carray.length > 0"
+                >
+                  <span v-if="item.array.length === 0">去填写</span>
+                  <span v-else>再填一份</span>
+                </div>
+                <div
+                  @click="doTest2(item.courseid)"
+                  class="editBtn"
+                  :style="`${item.open ? 'display:flex' : ''}`"
+                  v-if="!item.carray.length > 0"
+                >
+                  <span v-if="item.array.length === 0">去填写</span>
+                  <span v-else>再填一份</span>
+                </div>
+              </div>
+              <div class="test_panel_box" v-if="item.open">
+                <div class="test_add_box" v-if="item.array">
+                  <div
+                    class="test"
+                    v-for="(test, index) in item.array"
+                    :key="test.id"
+                  >
+                    <div class="time">
+                      <span v-if="!test.editName && !test.name"
+                        >提交记录{{ item.array.length - index }}</span
+                      >
+                      <span v-if="!test.editName && test.name">{{
+                        test.name
+                      }}</span>
+                      <el-input
+                        :ref="`changeName_${test.id}`"
+                        v-if="test.editName"
+                        v-model="test.name"
+                        @blur="changeNameUpdate(test.courseid, test.id)"
+                        @keyup.enter.native="
+                          changeNameUpdate(test.courseid, test.id)
+                        "
+                      ></el-input>
+                    </div>
+                    <div class="testType">
+                      <span :class="`typeStatus_${test.type}`">{{
+                        typeStatusList[test.type]
+                      }}</span>
+                    </div>
+                    <div class="utime">
+                      <span>{{ test.utime }}</span>
+                    </div>
+                    <div class="mask">
+                      <div
+                        @click="doTest(test.courseid, test.id)"
+                        v-if="test.isReview != 1"
+                      >
+                        <span>编辑</span>
+                      </div>
+                      <div
+                        @click="deleteTest(test.id)"
+                        class="delete"
+                        v-if="test.isReview != 1"
+                      >
+                        <span>删除</span>
+                      </div>
+                      <div
+                        @click="changeName(test.courseid, test.id)"
+                        v-if="test.isReview != 1"
+                      >
+                        <span>重命名</span>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+                <div
+                  class="test_add_box"
+                  v-else-if="item.carray"
+                  v-loading="!item.carray.length"
+                >
+                  <div
+                    class="test courseLength"
+                    v-for="(course, index) in item.carray"
+                    :key="index"
+                  >
+                    <div class="time">
+                      <el-tooltip
+                        :content="course.title + '-' + course.username"
+                        placement="top"
+                        effect="dark"
+                      >
+                        <span>{{ course.title }}-{{ course.username }}</span>
+                      </el-tooltip>
+                    </div>
+                    <div class="finishBox" :class="{ is: course.array.length }">
+                      <span class="finish"></span>
+                      <span v-if="course.array.length">已评分</span>
+                      <span v-else>未评分</span>
+                    </div>
+                    <div class="utime" style="margin-left: 30px;">
+                      <span v-if="course.array.length">{{
+                        course.array[0].utime
+                      }}</span>
+                      <span v-else></span>
+                    </div>
+                    <div class="mask">
+                      <div @click="doTest3(item, course)">
+                        <span>评分</span>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </template>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import topBar from "./components/topBar";
+import card from "./components/card.vue";
+export default {
+  components: {
+    topBar,
+    card
+  },
+  computed: {
+    isOK() {
+      return function(array) {
+        // console.log('array',array);
+        let result = "";
+        if (array.length > 0) {
+          let k = array.filter(e => e.type == 1 || e.type == 4);
+          if (k.length) {
+            result = "待办";
+          } else {
+            result = "已完成";
+          }
+        } else {
+          result = "待办";
+        }
+
+        return result;
+      };
+    },
+    // 进行权限判断一些只有管理员能看
+    cardData() {
+      return val => {
+        if (this.tType == 1) return val
+
+        let com = val.filter(
+          e => e.type == 0
+        );
+        return com;
+      };
+    }
+  },
+  data() {
+    return {
+      role: this.$route.query.role,
+      userid: this.$route.query.userid,
+      tType:this.$route.query.tType,
+      userInfo: {},
+      activeId: "",
+      loading: false,
+
+      // 标签数组
+      tagArrList: [],
+
+      // 任务数组
+      worksArray: [],
+      typeStatusList: ["", "未提交", "已提交", "", "已退回"],
+
+      cardArray: [
+        {
+          title: "课程中心",
+          icon: require("../../../assets/icon/liyuan/niandukaohe.svg"),
+          type: 0,
+          to: "/courseCenter",
+        },
+        {
+          title: "人才数据库",
+          icon: require("../../../assets/icon/liyuan/zhinengbiaodan.svg"),
+          type: 1,
+          to: "/sassPlatform",
+          sassPlatFormTypeId: "eefb7195-8ee7-11f0-9c7b-005056924926",
+        },
+        {
+          title: "学生画像",
+          icon: require("../../../assets/icon/liyuan/jiaoshihuaxiang.svg"),
+          type: 0,
+          to: "/testReview",
+        }
+      ]
+    };
+  },
+  methods: {
+    goToPage(to) {
+      if (to == '/testReview') return this.$message.info('该功能尚未上线,敬请期待')
+      try {
+          window.topU.gotype = 'bjspersonTop'
+          // console.log('top',this.$route.path);
+      } catch (error) {
+          console.log(error);
+      }
+      let params = {
+        userid: this.userid,
+        oid: this.userInfo.organizeid,
+        org: this.userInfo.org,
+        role: this.userInfo.role,
+        tType: this.userInfo.type,
+        sassPlatFormTypeId:'ce4f1224-37a5-11f1-bcd9-005056924926'
+      };
+      this.$router.push({
+        path: to,
+        query: params
+      });
+    },
+
+    isDeadlinePassed(deadline) {
+      let _line = new Date(deadline);
+      const currentDate = new Date();
+      return currentDate > _line;
+    },
+
+    doTest(cid, tid) {
+      try {
+          window.topU.gotype = 'bjspersonTop'
+      } catch (error) {
+          console.log(error);
+      }
+      this.$router.push(
+        "/doTest?cid=" +
+          cid +
+          "&tid=" +
+          tid +
+          "&userid=" +
+          this.userid +
+          "&oid=" +
+          this.oid +
+          "&org=" +
+          this.org +
+          "&type=3" +
+          "&role=" +
+          this.role
+      );
+    },
+    doTest2(cid) {
+      try {
+          window.topU.gotype = 'bjspersonTop'
+      } catch (error) {
+          console.log(error);
+      }
+      this.$router.push(
+        "/doTest?cid=" +
+          cid +
+          "&userid=" +
+          this.userid +
+          "&oid=" +
+          this.oid +
+          "&org=" +
+          this.org +
+          "&type=3" +
+          "&role=" +
+          this.role
+      );
+    },
+    doTest3(item, course) {
+      try {
+          window.topU.gotype = 'bjspersonTop'
+      } catch (error) {
+          console.log(error);
+      }
+      if (course.array.length) {
+        this.$router.push(
+          "/doTest?cid=" +
+            item.courseid +
+            "&tid=" +
+            course.array[0].id +
+            "&userid=" +
+            this.userid +
+            "&oid=" +
+            this.oid +
+            "&org=" +
+            this.org +
+            "&type=3" +
+            "&role=" +
+            this.role
+        );
+      } else {
+        this.$router.push(
+          "/doTest?cid=" +
+            item.courseid +
+            "&userid=" +
+            this.userid +
+            "&oid=" +
+            this.oid +
+            "&org=" +
+            this.org +
+            "&type=3" +
+            "&courseid=" +
+            course.courseid +
+            "&role=" +
+            this.role
+        );
+      }
+    },
+    copyTest(tid) {
+      let params = [
+        {
+          tid: tid,
+          uid: this.userid
+        }
+      ];
+      this.ajax
+        .post(this.$store.state.api + "copyTestWorks", params)
+        .then(res => {
+          this.$message.success("复制成功");
+          this.getWorks();
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
+    deleteTest(tid) {
+      let _this = this;
+      _this
+        .$confirm("确定删除此填写的表单么?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+        .then(() => {
+          let params = [
+            {
+              tid: tid
+            }
+          ];
+          _this.ajax
+            .post(_this.$store.state.api + "deleteTestCourseWorks", params)
+            .then(res => {
+              _this.$message.success("删除成功");
+              _this.getWorks();
+            })
+            .catch(err => {
+              console.error(err);
+            });
+        })
+        .catch(() => {
+          return;
+        });
+    },
+    changeShowType(value) {
+      this.checkTypeValue = value;
+      this.getWorks();
+    },
+    changeNameUpdate(courseId, testId) {
+      let array = this.worksArray.find(i => i.courseid == courseId);
+      if (array) {
+        array = array.array;
+        array.find(i => i.id == testId).editName = false;
+        this.$forceUpdate();
+        let data = array.find(i => i.id == testId);
+        let params = [
+          {
+            uid: this.userid,
+            testId: testId,
+            newName: data.name
+          }
+        ];
+
+        this.ajax
+          .post(
+            this.$store.state.api + "update_testCourseWorksNameById",
+            params
+          )
+          .then(res => {
+            if (res.data == 1) {
+              this.$message.success("修改成功");
+            } else {
+              this.$message.error("修改失败");
+              array.find(i => i.id == testId).name = "";
+            }
+          });
+      }
+    },
+    changeName(courseId, testId) {
+      let array = this.worksArray.find(i => i.courseid == courseId);
+      if (array) {
+        array = array.array;
+        array.find(i => i.id == testId).editName = true;
+        this.$forceUpdate();
+        this.$nextTick(() => {
+          console.log(this.$refs[`changeName_${testId}`]);
+          this.$refs[`changeName_${testId}`][0].focus();
+        });
+      }
+    },
+    getTasktag() {
+      this.loading = true;
+      let params = {
+        oid: ""
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestType_liYuan", params)
+        .then(res => {
+          let _data = res.data[0];
+          this.tagArrList = _data.filter(
+            e => e.pid == "ce4f1224-37a5-11f1-bcd9-005056924926"
+          );
+
+          this.getWorks("");
+        })
+        .catch(err => {
+          this.loading = false;
+          console.error(err);
+        });
+    },
+    getWorks(id) {
+      this.activeId = id;
+      this.loading = true;
+      let allid = [];
+      if (this.tagArrList.length) {
+        allid = this.tagArrList.map(item => item.id);
+        allid.push("ce4f1224-37a5-11f1-bcd9-005056924926");
+      }
+      let params = {
+        uid: this.userid,
+        typeid: this.activeId ? this.activeId : allid.join(",")
+      };
+      this.ajax
+        .get(this.$store.state.api + "getTestWorksPerson_2type", params)
+        .then(res => {
+          let array = res.data[0];
+          let array2 = res.data[1];
+          // 用于存储归类后的数据的对象
+          let worksArray = {};
+
+          // 遍历原始数据,根据 parentId 进行分组
+          array2.forEach(item => {
+            // console.log(item.chapters);
+            worksArray[item.courseId] = {
+              id: item.id,
+              courseid: item.courseId,
+              title: item.title,
+              time: item.time,
+              utime: item.utime,
+              overtime: item.overtime,
+              username: item.username,
+              chapters: item.chapters,
+              brief: item.brief,
+              typeid: item.typeid,
+              array:
+                item.typeid == "dda9728e-5f11-469e-89ee-aca518daf123" ? 0 : [],
+              carray: [],
+              open: false
+            };
+          });
+          worksArray = Object.values(worksArray);
+          worksArray.forEach(async el => {
+            if (el.typeid == "dda9728e-5f11-469e-89ee-aca518daf123") {
+              let courseJson = this.returnCourseJSON(el.chapters);
+              if (courseJson && courseJson.courses.length) {
+                let courses = courseJson.courses.join(",");
+                let _res = await this.getAllCourse(courses);
+                console.log(_res);
+                let _carray = [];
+                for (var i = 0; i < _res.length; i++) {
+                  _carray.push({
+                    courseid: _res[i].courseId,
+                    title: _res[i].title,
+                    username: _res[i].username,
+                    array: []
+                  });
+                }
+                el.carray = _carray;
+              }
+            }
+
+            array.forEach(el2 => {
+              if (
+                el.courseid == el2.courseid &&
+                el.typeid != "dda9728e-5f11-469e-89ee-aca518daf123"
+              ) {
+                el.array.push(el2);
+              }
+
+              if (
+                el.courseid == el2.courseid &&
+                el.typeid == "dda9728e-5f11-469e-89ee-aca518daf123"
+              ) {
+                let courseid = this.returnCourseId(el2.courseJson);
+                for (var c = 0; c < el.carray.length; c++) {
+                  if (el.carray[c].courseid == courseid) {
+                    el.carray[c].array.push(el2);
+                    break;
+                  }
+                }
+              }
+            });
+          });
+
+          this.worksArray = worksArray;
+          this.loading = false;
+
+          this.$forceUpdate();
+        })
+        .catch(err => {
+          this.loading = false;
+          console.error(err);
+        });
+    },
+    returnCourseId(array) {
+      let _array = JSON.parse(array);
+      let courseJson = "";
+      s: for (var j = 0; j < _array.length; j++) {
+        let el = _array[j];
+        if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+          for (var k2 = 0; k2 < el.array.length; k2++) {
+            let item = el.array[k2];
+            console.log(k2);
+            if (item.ttype == 2 && item.array.length > 0) {
+              for (var z = 0; z < item.array.length; z++) {
+                let item2 = item.array[z];
+                if (
+                  item2.ttype == 1 &&
+                  item2.type == 6 &&
+                  item2.json &&
+                  item2.json.answer2
+                ) {
+                  courseJson = item2.json.answer2;
+                  break s;
+                }
+              }
+            } else if (
+              item.ttype == 1 &&
+              item.type == 6 &&
+              item.json &&
+              item.json.answer2
+            ) {
+              courseJson = item.json.answer2;
+              break s;
+            }
+          }
+        } else if (
+          el.ttype == 1 &&
+          el.type == 6 &&
+          el.json &&
+          el.json.answer2
+        ) {
+          courseJson = el.json.answer2;
+          break s;
+        }
+      }
+      return courseJson;
+    },
+    async getAllCourse(id) {
+      let params = {
+        cid: id
+      };
+      let res = await this.ajax.get(
+        this.$store.state.api + "getCourseInfoTestAll",
+        params
+      );
+      return res.data[0];
+    },
+    returnCourseJSON(array) {
+      let _array = JSON.parse(array);
+      let courseJson = "";
+      s: for (var j = 0; j < _array.length; j++) {
+        let el = _array[j];
+        if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+          for (var k2 = 0; k2 < el.array.length; k2++) {
+            let item = el.array[k2];
+            console.log(k2);
+            if (item.ttype == 2 && item.array.length > 0) {
+              for (var z = 0; z < item.array.length; z++) {
+                let item2 = item.array[z];
+                if (item2.ttype == 1 && item2.type == 6 && item2.json) {
+                  courseJson = item2.json;
+                  break s;
+                }
+              }
+            } else if (item.ttype == 1 && item.type == 6 && item.json) {
+              courseJson = item.json;
+              break s;
+            }
+          }
+        } else if (el.ttype == 1 && el.type == 6 && el.json) {
+          courseJson = el.json;
+          break s;
+        }
+      }
+      return courseJson;
+    },
+
+    openWork(index) {
+      if (
+        this.worksArray[index].array.length === 0 &&
+        this.worksArray[index].carray.length === 0
+      ) {
+        return;
+      }
+      this.worksArray[index].open = !this.worksArray[index].open;
+      this.$forceUpdate();
+    },
+    async getData() {
+      let params = { uid: this.userid };
+      this.ajax
+        .get(this.$store.state.api + "selectliyuanUserInfo", params)
+        .then(res => {
+          this.userInfo = res.data[0][0];
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    }
+  },
+  mounted() {
+    this.getTasktag();
+    this.getData();
+  }
+};
+</script>
+
+<style scoped>
+.teacherDevelop {
+  width: 100%;
+  min-height: 100%;
+  padding: 40px 90px;
+  box-sizing: border-box;
+  background: #fafafa;
+}
+.topTalent_container {
+  max-width: 1200px;
+  margin: 0 auto;
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+}
+.taskContainer {
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+}
+.taskTitle {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.taskTitle_left {
+  display: flex;
+  align-items: center;
+  gap: 20px;
+}
+.taskBox {
+  display: flex;
+  gap: 10px;
+  background: #f3f4f6;
+  border-radius: 5px;
+  padding: 3px;
+  box-sizing: border-box;
+  box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.1);
+}
+.cardBox {
+  display: grid;
+  grid-template-columns: repeat(5, 1fr);
+  gap: 20px;
+  width: 100%;
+  margin-top: 20px;
+}
+.topTalent_bg {
+  width: 100%;
+  background: linear-gradient(90deg, #2563eb 15%, #4239cb 100%);
+  box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);
+  color: #fff;
+  border-radius: 10px;
+  padding: 20px;
+  box-sizing: border-box;
+  margin-bottom: 10px;
+  position: relative;
+  overflow: hidden;
+}
+.topTalent_bg_title {
+  font-size: 24px;
+  font-weight: 600;
+  margin-bottom: 10px;
+}
+.topTalent_bg_content {
+  width: 500px;
+  font-size: 16px;
+  color: #c0cff8;
+  font-weight: 400;
+}
+
+.topTalent_bg_decor {
+  position: absolute;
+  right: 0px;
+  top: 0px;
+  width: 220px;
+  height: 100%;
+  pointer-events: none;
+}
+.topTalent_bg_circle {
+  position: absolute;
+  border-radius: 50%;
+  background: rgba(255, 255, 255, 0.1);
+}
+.topTalent_bg_circle.circle_1 {
+  width: 140px;
+  height: 140px;
+  right: -20%;
+  top: -50%;
+}
+.topTalent_bg_circle.circle_2 {
+  width: 90px;
+  height: 90px;
+  right: 30px;
+  top: 60px;
+  background: rgba(255, 255, 255, 0.06);
+  border-color: rgba(255, 255, 255, 0.25);
+}
+.cardItem {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  background: #fff;
+  border-radius: 10px;
+  padding: 10px;
+  box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);
+  box-sizing: border-box;
+  cursor: pointer;
+  &:hover {
+    background: #f5f5f5;
+  }
+}
+.cardItem img {
+  width: 60px;
+  height: 60px;
+}
+.taskItem_box {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 5px 10px;
+  border-radius: 5px;
+  font-size: 14px;
+  box-sizing: border-box;
+  cursor: pointer;
+  &:hover {
+    background: #fff;
+  }
+}
+.taskItem_active {
+  background: #fff;
+  color: #4777ed;
+  box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);
+}
+.taskList_container {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  background: #fff;
+  border-radius: 10px;
+  box-sizing: border-box;
+  box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.1);
+}
+.Item_box {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 10px 20px;
+  font-size: 16px;
+  box-sizing: border-box;
+  border-bottom: 1px solid #e5e7eb;
+}
+.sleft {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+.redPoint {
+  width: 10px;
+  height: 10px;
+  border-radius: 50%;
+}
+.taskTitle_text {
+  font-size: 14px;
+  font-weight: 600;
+}
+.taskType {
+  font-size: 10px;
+  color: #6088f0;
+  background: #eff6ff;
+  padding: 3px 5px;
+  border-radius: 5px;
+  box-sizing: border-box;
+}
+.time_box {
+  font-size: 12px;
+  color: #989da5;
+  padding: 3px 5px;
+  border-radius: 5px;
+  margin-top: 3px;
+  box-sizing: border-box;
+}
+.write_btn {
+  font-size: 14px;
+  color: #4777ed;
+  padding: 5px 10px;
+  border-radius: 25px;
+  box-sizing: border-box;
+  font-size: 12px;
+  font-weight: 500;
+  background-color: #eff6ff;
+  cursor: pointer;
+}
+.write_btn2 {
+  font-size: 14px;
+  color: #747a88;
+  padding: 5px 10px;
+  border-radius: 25px;
+  box-sizing: border-box;
+  font-size: 12px;
+  font-weight: 500;
+  background-color: #f3f4f6;
+}
+.i_body_box {
+  box-sizing: border-box;
+  height: 100%;
+  display: flex;
+  background: #fff;
+  flex-direction: column;
+}
+
+.check_nav {
+  display: flex;
+  height: 50px;
+  align-items: center;
+  padding: 0;
+  box-sizing: border-box;
+  width: 100%;
+  overflow: auto;
+  padding: 0 90px;
+}
+
+.check_nav > .nav {
+  width: 120px;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: rgb(167, 167, 167);
+  /* background: #000000; */
+  cursor: pointer;
+  min-width: fit-content;
+  margin-right: 10px;
+}
+
+.check_nav > .active {
+  color: #3681fc;
+  background: rgb(248, 250, 254);
+  border-radius: 10px 10px 0 0;
+}
+
+.check_nav > .all::before,
+.check_nav > .gr::before,
+.check_nav > .md::before,
+.check_nav > .jy::before,
+.check_nav > .bj::before,
+.check_nav > .yy::before {
+  content: "";
+  display: block;
+  width: 18px;
+  height: 18px;
+  background-size: 100% 100%;
+  margin-right: 5px;
+}
+
+.check_nav > .all::before {
+  background-image: url("../../../assets/icon/test/all_icon.png");
+}
+
+.check_nav > .active.all::before {
+  background-image: url("../../../assets/icon/test/all_icon_active.png");
+}
+
+.check_nav > .gr::before {
+  background-image: url("../../../assets/icon/test/gr_icon.png");
+}
+
+.check_nav > .active.gr::before {
+  background-image: url("../../../assets/icon/test/gr_icon_active.png");
+}
+
+.check_nav > .md::before {
+  background-image: url("../../../assets/icon/test/md_icon.png");
+}
+
+.check_nav > .active.md::before {
+  background-image: url("../../../assets/icon/test/md_icon_active.png");
+}
+
+.check_nav > .jy::before {
+  background-image: url("../../../assets/icon/test/jy_icon.png");
+}
+
+.check_nav > .active.jy::before {
+  background-image: url("../../../assets/icon/test/jy_icon_active.png");
+}
+
+.check_nav > .yy::before {
+  background-image: url("../../../assets/icon/test/yy_icon.png");
+}
+
+.check_nav > .active.yy::before {
+  background-image: url("../../../assets/icon/test/yy_icon_active.png");
+}
+
+.check_nav > .bj::before {
+  background-image: url("../../../assets/icon/test/bj_icon.png");
+}
+
+.check_nav > .active.bj::before {
+  background-image: url("../../../assets/icon/test/bj_icon_active.png");
+}
+
+.check_box {
+  height: calc(100% - 50px);
+  overflow: auto;
+  padding: 0 0 20px;
+  box-sizing: border-box;
+}
+
+.test_panel {
+  width: calc(100% - 5px);
+  margin: 20px auto 0;
+  background: #fff;
+  border-radius: 10px;
+  /* height: 300px; */
+  overflow: hidden;
+  box-shadow: 0 2px 5px 1px #0001;
+}
+
+.test_panel:hover {
+  box-shadow: 0 0 2px 1px #3681fc;
+}
+
+.test_panel:hover > .test_panel_title > .title {
+  color: #5996fd;
+}
+
+.test_panel_title:hover > .editBtn {
+  display: flex;
+}
+.test_panel_title:hover > .editBtn2 {
+  display: flex;
+}
+
+/* .test_panel + .test_panel {
+  margin-top: 15px;
+} */
+
+.test_panel_title {
+  height: 50px;
+  display: flex;
+  align-items: center;
+  width: 100%;
+  position: relative;
+  /* justify-content: space-between; */
+  /* padding: 0 20px; */
+  box-sizing: border-box;
+  /* border-bottom: 2px solid #f0f0f0; */
+}
+
+.test_panel_title > .title {
+  display: flex;
+  align-items: center;
+  width: 300px;
+  margin-left: 20px;
+  cursor: pointer;
+}
+
+.test_panel_title > .title > .open {
+  width: 20px;
+  height: 20px;
+  margin-right: 10px;
+  background-image: url("../../../assets/icon/test/chevron-right.png");
+  background-size: 100% 100%;
+  cursor: pointer;
+  transition: all 0.3s;
+  opacity: 0.5;
+}
+
+.test_panel_title > .title > .open.active {
+  transform: rotate(90deg);
+  opacity: 1;
+}
+
+.test_panel_title > .state {
+  margin-left: auto;
+  min-width: fit-content;
+}
+
+.test_panel_title > .state > span {
+  font-size: 14px;
+  padding: 5px 8px;
+  border-radius: 5px;
+  margin-right: 0;
+}
+
+.test_panel_title > .state > .is:nth-child(1) {
+  color: #17c469;
+  background: #effcf5;
+  border: 1px solid #effcf5;
+}
+
+.test_panel_title > .state > .no:nth-child(1) {
+  color: #3681fc;
+  background: #e0eafb;
+  border: 1px solid #e0eafb;
+}
+
+.test_panel_title > .title > .titleN {
+  font-size: 18px;
+  font-weight: 600;
+  max-width: calc(100% - 20px - 10px);
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.test_panel_title > .time {
+  font-size: 16px;
+  color: #a1a1a1;
+  min-width: 160px;
+  margin: 0 30px;
+}
+
+.test_panel_title > .creator {
+  font-size: 16px;
+  color: #a1a1a1;
+  max-width: 160px;
+  min-width: 160px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.test_panel_title > .editBtn {
+  font-size: 16px;
+  color: #fff;
+  background: #3681fc;
+  height: 100%;
+  display: none;
+  align-items: center;
+  padding: 0 15px;
+  cursor: pointer;
+  position: absolute;
+  right: 0;
+}
+.test_panel_title > .editBtn2 {
+  font-size: 16px;
+  color: #fff;
+  background: #3681fc;
+  height: 100%;
+  display: none;
+  align-items: center;
+  padding: 0 15px;
+  cursor: pointer;
+}
+
+.test_panel_title > .time > span + span {
+  margin-left: 10px;
+}
+
+.test_panel_box {
+  border-top: 2px solid #f0f0f0;
+  width: 100%;
+  display: flex;
+  align-items: center;
+  padding: 5px 20px;
+  box-sizing: border-box;
+}
+
+.test_panel_box > .detail {
+  width: calc(100% - 350px - 20px);
+  margin-right: 20px;
+  color: #a1a1a1;
+  font-size: 14px;
+  line-height: 24px;
+  word-break: break-all;
+  display: -webkit-box;
+  -webkit-line-clamp: 4;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+}
+
+.test_panel_box > .panel {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  width: 350px;
+  min-width: 350px;
+}
+
+.test_panel_box > .panel > .score {
+  height: 110px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+  border: 1px solid #dbdbdb;
+  background: rgb(252, 252, 252);
+  width: 120px;
+  border-radius: 5px;
+}
+
+.test_panel_box > .panel > .score:nth-child(1) {
+  display: flex;
+}
+
+.test_panel_box > .panel > .score > div:nth-child(1) > span:nth-child(1) {
+  font-size: 30px;
+  font-weight: 700;
+}
+
+.test_panel_box > .panel > .score > div:nth-child(1) > span:nth-child(2) {
+  margin-left: 5px;
+}
+
+.test_panel_box > .panel > .score > div:nth-child(2) {
+  font-size: 14px;
+  margin-top: 10px;
+  color: #a1a1a1;
+}
+
+.test_panel_box > .panel > .btn {
+  height: 100px;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+
+.test_panel_box > .panel > .btn > div {
+  display: flex;
+  color: rgb(69, 141, 255);
+  align-items: center;
+  cursor: pointer;
+  font-size: 14px;
+}
+
+/* .test_panel_box > .panel >.btn > div + div{
+      margin: 15px 0 0 0;
+    } */
+.test_panel_box > .panel > .btn > div > span:nth-child(1) {
+  display: block;
+  width: 13px;
+  height: 13px;
+  background-size: 100% 100%;
+  margin-right: 7px;
+}
+
+.test_panel_box > .panel > .btn > div:nth-child(1) > span:nth-child(1) {
+  background-image: url("../../../assets/icon/test/edit_icon.png");
+}
+
+.test_panel_box > .panel > .btn > div:nth-child(2) > span:nth-child(1) {
+  background-image: url("../../../assets/icon/test/check_icon.png");
+}
+
+.test_panel_box > .panel > .btn > div:nth-child(3) > span:nth-child(1) {
+  background-image: url("../../../assets/icon/test/paste_icon.png");
+}
+
+.test_add_box {
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.test_add_box > .test {
+  width: 100%;
+  height: 40px;
+  border-radius: 5px;
+  display: flex;
+  align-items: center;
+}
+
+.test_add_box > .test > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+  border-radius: 5px;
+}
+
+.test_add_box > .test + .test {
+  /* margin-left: 10px; */
+}
+
+.test_add_box > .test > .time {
+  display: flex;
+  /* justify-content: center; */
+  align-items: center;
+  font-size: 14px;
+  width: 300px;
+  padding-left: 30px;
+  box-sizing: border-box;
+}
+
+.test_add_box > .test > .time > span {
+  /* margin-top: 5px; */
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.test_add_box > .test > .utime {
+  font-size: 14px;
+  width: 160px;
+  min-width: 160px;
+  margin: 0 30px 0 0;
+}
+.test_add_box > .test > .mask {
+  display: flex;
+  align-items: center;
+  padding-right: 58px;
+  max-width: 160px;
+  min-width: 160px;
+}
+
+.test_add_box > .test > .delete {
+  position: absolute;
+  width: 20px;
+  height: 20px;
+  right: -5px;
+  top: -5px;
+  cursor: pointer;
+  z-index: 2;
+  display: none;
+}
+
+.test_add_box > .test > .mask > div {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  font-size: 14px;
+  color: #3681fc;
+}
+
+.test_add_box > .test > .mask > .delete {
+  color: #ee3e3e;
+}
+
+.test_add_box > .test > .mask > div + div {
+  margin-left: 15px;
+}
+
+.bgColor {
+  background: #466b99;
+}
+
+.courseLength > .finishBox {
+  display: flex;
+  color: #a1a1a1;
+  font-size: 14px;
+  margin-left: auto;
+  align-items: center;
+}
+.courseLength > .finishBox > .finish {
+  width: 15px;
+  height: 15px;
+  background-image: url("../../../assets/icon/test/icon_course.png");
+  background-size: 100% 100%;
+  margin-right: 5px;
+}
+.courseLength > .finishBox.is > .finish {
+  background-image: url("../../../assets/icon/test/icon_course_check.png");
+}
+.courseLength > .finishBox.is {
+  color: #000;
+}
+
+.isDead {
+  color: #ee3e3e;
+}
+
+.testType {
+  width: 60px;
+  margin: 0 45px 0 auto;
+}
+
+.testType > span {
+  padding: 6px 10px;
+  border-radius: 4px;
+  border: solid 1px gray;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 12px;
+}
+
+.testType > .typeStatus_2 {
+  background: #f0f9f2;
+  border-color: #b5e3bf;
+  color: #5fc875;
+}
+
+.testType > .typeStatus_4 {
+  background: #fef5ec;
+  border-color: #fad0a1;
+  color: #f7933b;
+}
+
+.testType > .typeStatus_1 {
+  background: #eef3fc;
+  border-color: #0f40f5;
+  color: #0f40f5;
+}
+</style>

+ 300 - 0
src/components/pages/liyuan/page/courseCenter.vue

@@ -0,0 +1,300 @@
+<template>
+  <div class="courseCenter">
+    <div class="header">
+      <div @click="$router.go(-1)" style="cursor: pointer;display: flex;align-items: center;">
+        <img
+          style="cursor: pointer;"
+          src="https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E8%BF%94%E5%9B%9E1776417712913.png"
+          alt=""
+        />
+      </div>
+     
+      <div class="header_title">
+        <div>课程中心</div>
+        <div>汇聚拔尖名师资源,提供定制化、进阶式的拓展课程。</div>
+      </div>
+    </div>
+    <div class="serachCon">
+      <el-input
+        placeholder="搜索课程..."
+        prefix-icon="el-icon-search"
+        @change="getCourseList"
+        v-model="search"
+      >
+      </el-input>
+    </div>
+    <div :class="courseList.length > 5 ? 'courseDataL' : 'courseDataLFlex'" v-loading="loading">
+      <div class="Conblock" v-for="(i, index) in courseList" :key="index">
+        <img
+          class="PimgL"
+          :src="
+            i.cover != null && i.cover != ''
+              ? JSON.parse(i.cover).length > 0
+                ? JSON.parse(i.cover)[0].url
+                : mr
+              : mr
+          "
+          alt
+        />
+        <div class="ConblockTit">
+          {{ i.title }}
+        </div>
+        <div style="display: flex;gap: 10px;color: #969BA3;font-size: 14px;padding: 0 16px;">
+          <span>{{ i.uname }}</span>
+          <!-- <span>@{{ i.school }}</span> -->
+        </div>
+        <div class="foot">
+          <!-- <img style="cursor: pointer;"
+                v-if="i.userid == userid" 
+                @click="goToCourse(i.courseId)" 
+                src="../../../../assets/icon/liyuan/courseEditC.svg" alt=""> -->
+          <div class="ent" @click="entCourse(i)">进入课程</div>
+        </div>
+      </div>
+    </div>
+    <div style="display: flex;justify-content: flex-end;align-items: center;padding: 20px 0;">
+        <el-pagination
+        background
+        layout="prev, pager, next"
+        :total="total"
+        :page-size="pageSize"
+        :current-page="page"
+        @current-change="getCourseList"
+        >
+        </el-pagination>
+    </div>
+   
+  </div>
+</template>
+<script>
+import { myMixin } from "@/mixins/mixin.js";
+export default {
+  mixins: [ myMixin ],
+  name: "courseCenter",
+  data() {
+    return {
+      search: "",
+      oid: this.$route.query["oid"],
+      userid: this.$route.query["userid"],
+      org: this.$route.query["org"],
+      role: this.$route.query["role"],
+      courseList: [],
+      total: 0,
+      page: 1,
+      pageSize: 8,
+      loading: false
+    };
+  },
+  methods: {
+    searchCourse() {
+      console.log(this.search);
+    },
+    getCourseList() {
+      this.loading = true;
+      this.ajax
+        .get(this.$store.state.api + "selectPersonCourseList", {
+          oid: this.oid,
+          inp: this.search,
+          page: this.page,
+          num: this.pageSize
+        })
+        .then(res => {
+          console.log(res);
+          this.courseList = res.data[0];
+          this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+          console.log(err);
+        });
+    },
+    async entCourse(item) {
+      let _str = "";
+      if (item.state == 1) {
+        _str = "course_stageMode_open";
+      }
+      if (item.state == 2) {
+        _str = "course_taskMode_open";
+      }
+      if (item.state == 3) {
+        _str = "course_easyMode_open";
+      }
+      if (item.state == 5) {
+        _str = "course_aiMode_open";
+      }
+      if (item.state == 6) {
+        _str = "course_aiEasyMode_open";
+      }
+      const user = await this.getUser();
+
+      let url = '';
+      if (user.type == '1') {
+        url = `https://pbl.cocorobo.cn/pbl-student-table/dist/#/courseDetail?userid=${user.userid}&oid=${user.organizeid}&org=${user.org}&courseId=${item.courseId}&tType=${user.type}&cid=${user.classid}&screenType=2`
+        // https://pbl.cocorobo.cn/pbl-student-table/dist/#/index?userid=&oid=&org=&tType=&cid=TscreenType=1
+      }else{
+        url = `https://pbl.cocorobo.cn/pbl-student-table/dist/#/courseDetail?courseId=${item.courseId}&userid=${user.userid}&oid=${user.organizeid}&org=${user.org}&cid=${user.classid}&tType=${user.type}&screenType=2`
+      }
+      console.log('url',url);
+      window.topU.U.MD.D.I.openInApplication('setUrl',{url:url,title:'课程详情',id:new Date().getTime()})
+      this.addOp3("1", "", { courseid: item.courseId, type: _str }, "success");
+    },
+     // 获取创建学生用户后缀
+    async getUser() {
+      return new Promise((resolve, reject) => {
+        let params = {
+          userid: this.userid
+        };
+        this.ajax
+          .get(this.$store.state.api + "selectUser", params)
+          .then(res => {
+            resolve(res.data[0][0]);
+          })
+          .catch(err => {
+            reject(err);
+          });
+      })
+      
+    },
+  },
+  mounted() {
+    this.getCourseList();
+  }
+};
+</script>
+<style scoped>
+.courseCenter {
+  width: 100%;
+  min-height: 100%;
+  padding: 30px;
+  box-sizing: border-box;
+  background-color: #f8fafc;
+}
+.header {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  box-sizing: border-box;
+  gap: 10px;
+  padding-bottom: 20px;
+  border-bottom: 1px solid #e5e5e5;
+}
+.header img {
+  width: 20px;
+  height: 20px;
+}
+.header_title {
+  display: flex;
+  flex-direction: column;
+  gap: 5px;
+}
+.header_title div:nth-child(1) {
+  font-size: 20px;
+  font-weight: bold;
+}
+.header_title div:nth-child(2) {
+  font-size: 14px;
+  color: #666;
+}
+.serachCon {
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+  gap: 10px;
+  padding: 20px 0;
+  box-sizing: border-box;
+}
+.serachCon >>> .el-input__icon {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.serachCon >>> .el-input {
+  width: 200px !important;
+}
+.serachCon >>> .el-input__inner {
+  height: 30px !important;
+  border-radius: 20px !important;
+  width: 200px !important;
+  border: 1px solid #e5e5e5;
+  background: #ffffff;
+}
+.courseList {
+  display: grid;
+  grid-template-columns: repeat(4, 1fr);
+  gap: 20px;
+}
+.courseItem {
+  display: flex;
+  flex-direction: column;
+}
+.courseDataL {
+    display: grid;
+    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+    gap: 20px;
+}
+.courseDataLFlex {
+  display: flex;
+  gap: 20px;
+  flex-wrap: wrap;
+}
+.Conblock {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  background: #fff;
+  border-radius: 12px;
+  min-width: 300px;
+  overflow: hidden;
+  padding-bottom: 10px;
+  box-sizing: border-box;
+  box-shadow: 0px 4px 10px 0px #0000001a;
+}
+.PimgL {
+  width: 100%;
+  height: 126px;
+  /* border-radius: 10px; */
+  object-fit: cover;
+}
+.ConblockTit {
+  font-size: 18px;
+  -webkit-line-clamp: 1;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  padding: 0 16px;
+}
+.foot {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  padding: 0 16px;
+}
+.ent {
+  background: #eff6ff;
+  width: 100%;
+  color: #507ee8;
+  cursor: pointer;
+  text-align: center;
+  font-weight: 600;
+  font-size: 14px;
+  border-radius: 10px;
+  padding: 10px 16px;
+  box-sizing: border-box;
+}
+/* .ent:hover{
+    border: 1px solid #4080FF;
+    background: #4080FF;
+    color: #fff;
+} */
+.moreL {
+  font-family: PingFang HK;
+  font-size: 16px;
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+  color: #969ba3;
+  justify-content: flex-end;
+}
+</style>

+ 135 - 66
src/components/pages/pptEasy/addCourse3.vue

@@ -9,6 +9,10 @@
       @confirm="handleConfirm"
       @cancel="handleCancel"
     />
+    <toast-message
+      :visible.sync="toastVisible"
+      :message="toastMessage"
+    />
 
     <div class="pb_content_body" style="position: relative; margin: 0">
       <div class="right">
@@ -797,11 +801,12 @@
         </div>
         <div class="modal-body publish-modal-body">
           <div class="course-name-display">
-            <div v-if="!editingCourseName" @click="editingCourseName = true" class="course-name-text">
+            <div v-if="!editingCourseName" @click="startEditCourseName" class="course-name-text">
               {{ courseName || lang.ssUntitledCourse }}
             </div>
             <el-input v-else v-model="courseName" @blur="editingCourseName = false; handleUpdateTitle()"
-              @keyup.enter="editingCourseName = false" class="course-name-input" autofocus></el-input>
+              @keyup.enter="editingCourseName = false" @input="updateInputWidth" ref="courseNameInput"
+              class="course-name-input" :style="{ width: inputWidth + 'px' }" autofocus></el-input>
           </div>
 
           <div class="form-box">
@@ -816,29 +821,6 @@
                     style="width: 100%;"
                   />
                 </div>
-                <div class="form-item required">
-                  <label class="form-label">{{ lang.ssClass }}{{ lang.ssLabel }}</label>
-                  <selectTag
-                    v-model="selectedGrade"
-                    :options="gradeOptions"
-                    :placeholder=lang.ssSelectGrade
-                    style="width: 100%;"
-                  />
-                </div>
-              </div>
-              <div class="form-row">
-                <div class="form-item required" style="flex: 2;">
-                  <label class="form-label">{{ lang.ssClass }}</label>
-                  <selectTag
-                    v-model="checkboxList2"
-                    :options="classOptions"
-                    :placeholder=lang.ssSelectClass
-                    style="width: 100%;"
-                  />
-                </div>
-              </div>
-
-              <!-- <div class="form-row">
                 <div class="form-item required">
                   <label class="form-label">{{ lang.ssGradeType }}</label>
                   <selectTag
@@ -848,17 +830,15 @@
                     style="width: 100%;"
                   />
                 </div>
+              </div>
+              <GradeClassSelector
+                v-model="checkboxList2"
+                :grade-options="gradeOptions"
+                :class-options="classOptions"
+                :lang="lang"
+                @gradeChange="onGradeChange"
+              />
 
-                <div class="form-item required">
-                  <label class="form-label">{{ lang.ssClass }}</label>
-                  <selectTag
-                    v-model="checkboxList2"
-                    :options="classOptions"
-                    :placeholder=lang.ssSelectClass
-                    style="width: 100%;"
-                  />
-                </div>
-              </div> -->
 
               <div class="form-row">
                 <div class="form-item required">
@@ -968,6 +948,8 @@ import InteractiveToolDialog from "./dialog/InteractiveToolDialog.vue";
 import VideoUploadDialog from "./dialog/VideoUploadDialog2.vue";
 import ConfirmDialog from "../../common/ConfirmDialog";
 import selectTag from "./dialog/selectTag3.vue";
+import ToastMessage from "./dialog/ToastMessage";
+import GradeClassSelector from "../../common/GradeClassSelector";
 
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
@@ -1022,7 +1004,9 @@ export default {
     BilibiliSearchDialog,
     appDialog,
     ConfirmDialog,
-    selectTag
+    selectTag,
+    ToastMessage,
+    GradeClassSelector
   },
   data() {
     return {
@@ -1044,6 +1028,8 @@ export default {
       confirmConfirmText: '',
       confirmCancelText: '',
       confirmCallback: null,
+      toastVisible: false,
+      toastMessage: '',
       loading: false,
       courseName: "",
       isTeacherSee: false,
@@ -1122,6 +1108,7 @@ export default {
       gradeList: [],
       grade: [],
       grade2: [],
+      gradeArray: [],
       noneBtnImg: false,
       inviteCode: [],
       nbOrder: 0,
@@ -1360,8 +1347,32 @@ export default {
       // 暂时使用模拟数据
       this.classOptions = this.grade2.map(item => ({
         id: item.id,
-        name: item.classname ? item.classname + '-' + item.name : item.name
+        pid: item.pid,
+        name: item.name
       }));
+      
+      // 初始化年级选项,添加全部班级选项
+      this.gradeOptions = [
+        { id: '', name: '全部班级' }
+      ].concat(this.gradeArray.map(item => ({
+        id: item.id,
+        name: item.name
+      })));
+      
+      // 初始化筛选后的班级选项
+      this.filteredClassOptions = this.classOptions;
+    },
+    // 年级选择变化时筛选班级
+    onGradeChange() {
+      if (this.selectedGrade === '') {
+        // 选择了全部班级,显示所有班级
+        this.filteredClassOptions = this.classOptions;
+      } else {
+        // 根据选择的年级筛选班级
+        this.filteredClassOptions = this.classOptions.filter(item => item.pid === this.selectedGrade);
+      }
+      // 清空已选择的班级,因为筛选后班级列表可能已经改变
+      // this.checkboxList2 = [];
     },
     // 确认发布
     confirmPublish() {
@@ -1711,6 +1722,40 @@ export default {
         this.role
       );
     },
+    showToast(message) {
+      this.toastMessage = message;
+      this.toastVisible = true;
+    },
+    updateInputWidth() {
+      // 创建一个隐藏的span元素来计算文字宽度
+      const span = document.createElement('span');
+      span.style.fontSize = '14px'; // 与输入框字体大小一致
+      span.style.fontFamily = 'Arial, sans-serif'; // 与输入框字体一致
+      span.style.whiteSpace = 'nowrap';
+      span.style.visibility = 'hidden';
+      span.style.position = 'absolute';
+      span.textContent = this.courseName;
+      document.body.appendChild(span);
+      
+      // 计算文字宽度,加上10px的padding
+      let width = span.offsetWidth + 10;
+      
+      // 确保宽度在最小和最大范围内
+      width = Math.max(width, 120); // 最小宽度:4个汉字 + 10px
+      width = Math.min(width, 500); // 最大宽度:500px
+      
+      this.inputWidth = width;
+      
+      // 移除临时span元素
+      document.body.removeChild(span);
+    },
+    startEditCourseName() {
+      this.editingCourseName = true;
+      // 在下一个DOM更新周期后计算宽度
+      this.$nextTick(() => {
+        this.updateInputWidth();
+      });
+    },
     //获取ppt的数据
     async getPPtJson() {
       const checkLoaded = async (resolve) => {
@@ -1942,10 +1987,7 @@ export default {
           this.uploadWorkLoading = false;
           console.log(this.steps);
           // if (this.steps != 1 && this.steps != 2 && this.steps != 3) {
-          this.$message({
-            message: this.lang.ssAddSucc,
-            type: "success"
-          });
+          this.showToast(this.lang.ssSaveSuccess);
           // }
           this.number = res.data.ordernumber;
           this.courseId = res.data.courseId;
@@ -2054,17 +2096,18 @@ export default {
         .then(res => {
           // if (this.steps != 1 && this.steps != 2 && this.steps != 3) {
           this.uploadWorkLoading = false;
-          if (this.cidType == 1) {
-            this.$message({
-              message: this.lang.ssModifySuccess,
-              type: "success"
-            });
-          } else {
-            this.$message({
-              message: this.lang.ssAddSucc,
-              type: "success"
-            });
-          }
+          // if (this.cidType == 1) {
+          //   this.$message({
+          //     message: this.lang.ssSaveSuccess,
+          //     type: "success"
+          //   });
+          // } else {
+          //   this.$message({
+          //     message: this.lang.ssSaveSuccess,
+          //     type: "success"
+          //   });
+          // }
+          this.showToast(this.lang.ssSaveSuccess);
           // }
           this.number = this.nbOrder;
           this.courseId = this.cid;
@@ -2108,6 +2151,7 @@ export default {
             this.grade = res.data[0];
           }
           this.grade2 = res.data[0];
+          this.gradeArray =  res.data[1];
           this.classJuri = res.data[0];
           let _check = [];
           let _check2 = [];
@@ -2122,6 +2166,9 @@ export default {
             }
           }
           this.checkAll = _check2.length === _check.length;
+          
+          // 初始化年级和班级选项
+          this.loadClassOptions();
         })
         .catch(err => {
           this.isLoading = false;
@@ -2531,7 +2578,8 @@ export default {
         typeof _pptIframe.contentWindow.window.loadContentList === "function"
       ) {
         _pptIframe.contentWindow.window.loadContentList();
-        this.$message.success(this.lang.ssAddOk);
+        // this.$message.success(this.lang.ssAddOk);
+        this.showToast(this.lang.ssAddOk);
       }
     },
     loadgetCourseDetail() {
@@ -2555,9 +2603,11 @@ export default {
       ) {
         _pptIframe.contentWindow.window.addContent(data, type);
         if (type == 2) {
-          this.$message.success(this.lang.ssModifySuccess);
+          // this.$message.success(this.lang.ssModifySuccess);
+          this.showToast(this.lang.ssModifySuccess);
         } else {
-          this.$message.success(this.lang.ssAddOk);
+          // this.$message.success(this.lang.ssAddOk);
+          this.showToast(this.lang.ssAddOk);
         }
       }
     },
@@ -2749,6 +2799,17 @@ export default {
     },
     // 打开应用中心
     openApplicationCenter() {
+
+      let url = 'https://app.cocorobo.cn'
+      if (this.lang.lang === 'cn') {
+        url = 'https://app.cocorobo.cn'
+      }
+      else if (this.lang.lang === 'hk') {
+        url = 'https://app.cocorobo.hk'
+      }
+      else if (this.lang.lang === 'en') {
+        url = 'https://app.cocorobo.com'
+      }
       // 创建Cocorobo链接工具项
       let cocoroboItem = {
         id: new Date().getTime(),
@@ -2758,9 +2819,9 @@ export default {
         json: {
           title: this.lang.ssCreateSpace,
           detail: this.lang.ssCreateSpace,
-          url: "https://app.cocorobo.cn"
+          url: url
         },
-        url: "https://app.cocorobo.cn"
+        url: url
       };
       this.pptCourseJson.toolsList.push(cocoroboItem);
       this.addContent(cocoroboItem)
@@ -2768,7 +2829,9 @@ export default {
     },
     setUrl() {
       let url = 'https://beta.pbl.cocorobo.cn'
-      if (this.lang.lang === 'cn') {
+      if (this.isBetaEnv()) {
+        url = url
+      }if (this.lang.lang === 'cn') {
         url = 'https://pbl.cocorobo.cn'
       }
       else if (this.lang.lang === 'hk') {
@@ -2777,6 +2840,7 @@ export default {
       else if (this.lang.lang === 'en') {
         url = 'https://pbl.cocorobo.com'
       }
+
       return url
     },
     addTest() {
@@ -4409,7 +4473,7 @@ export default {
 
 .progress-status {
   font-size: 12px;
-  color: #409eff;
+  color: #f88c22;
   white-space: nowrap;
 }
 
@@ -5035,6 +5099,7 @@ export default {
 .course-name-text {
   cursor: pointer;
   transition: color 0.3s;
+  font-size: 18px;
 }
 
 .course-name-text:hover {
@@ -5042,15 +5107,18 @@ export default {
 }
 
 .course-name-input {
-  width: 80%;
+  display: inline-block;
+  width: auto;
+  min-width: 120px; /* 假设每个汉字宽度约为 27.5px,4个汉字 + 10px = 120px */
+  max-width: 500px;
   margin: 0 auto;
   text-align: center;
+  font-size: 18px;
 }
 
-.course-name-input .el-input__inner {
-  font-size: 18px;
-  font-weight: 600;
-  text-align: center;
+.course-name-input >>> .el-input__inner {
+  background-color: #fff8f0;
+  border: 1px solid #f89a3d !important;
 }
 
 .publish-course-modal .form-box {
@@ -5235,6 +5303,7 @@ export default {
   cursor: pointer;
   transition: all 0.3s;
   margin-bottom: 4px;
+  font-size: 14px;
 }
 
 .option-item:last-child {
@@ -5368,8 +5437,8 @@ export default {
 }
 
 .web-search-footer .btn-cancel:hover {
-  border-color: #c6e2ff;
-  color: #409eff;
+  border-color: #ff9500;
+  color: #ff9500;
 }
 
 .web-search-footer .btn-confirm {

+ 13 - 6
src/components/pages/pptEasy/dialog/BilibiliSearchDialog2.vue

@@ -24,11 +24,11 @@
 					</div>
 					<div class="filter-item">
 						<el-select v-model="navActive" @change="navClick" :placeholder="lang.ssBiSort" class="sort-select">
-							<el-option :label="lang.ssBiSort" :value="0"></el-option>
-							<el-option :label="lang.ssBiPlay" :value="1"></el-option>
-							<el-option :label="lang.ssBiRelease" :value="2"></el-option>
-							<el-option :label="lang.ssBitDanmaku" :value="3"></el-option>
-							<el-option :label="lang.ssBiFavorite" :value="4"></el-option>
+							<el-option class="filter-item-option" :label="lang.ssBiSort" :value="0"></el-option>
+							<el-option class="filter-item-option" :label="lang.ssBiPlay" :value="1"></el-option>
+							<el-option class="filter-item-option" :label="lang.ssBiRelease" :value="2"></el-option>
+							<el-option class="filter-item-option" :label="lang.ssBitDanmaku" :value="3"></el-option>
+							<el-option class="filter-item-option" :label="lang.ssBiFavorite" :value="4"></el-option>
 						</el-select>
 					</div>
 					<div class="add-item">
@@ -357,7 +357,8 @@ export default {
         };
         this.$emit('addVideo', videoData);
       });
-      this.$message.success(this.lang.ssAddSuccessVideo.replace('*', this.selectedVideos.length));
+      // this.$message.success(this.lang.ssAddSuccessVideo.replace('*', this.selectedVideos.length));
+      console.log(this.lang.ssAddSuccessVideo.replace('*', this.selectedVideos.length));
       this.selectedVideos = [];
       // 批量添加成功后关闭弹窗
       this.handleClose();
@@ -763,5 +764,11 @@ export default {
         width: calc(100% / 2 - 10px) !important;
     }
 }
+
+.inputC >>> .el-input__inner:focus,
+.filter-item >>> .el-select .el-input__inner:focus,
+.filter-item >>> .el-select .el-input.is-focus .el-input__inner{
+  border-color: #ff9300;
+}
 </style>
 

+ 95 - 0
src/components/pages/pptEasy/dialog/ToastMessage.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="toast_message" v-if="visible">
+    <div class="toast_content">
+      <span>{{ message }}</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ToastMessage',
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    message: {
+      type: String,
+      default: ''
+    },
+    duration: {
+      type: Number,
+      default: 2000
+    }
+  },
+  data() {
+    return {
+      timer: null
+    }
+  },
+  watch: {
+    visible: {
+      handler(newVal) {
+        if (newVal) {
+          this.clearTimer();
+          this.timer = setTimeout(() => {
+            this.$emit('update:visible', false);
+          }, this.duration);
+        }
+      },
+      immediate: true
+    }
+  },
+  beforeDestroy() {
+    this.clearTimer();
+  },
+  methods: {
+    clearTimer() {
+      if (this.timer) {
+        clearTimeout(this.timer);
+        this.timer = null;
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.toast_message {
+  position: fixed;
+  top: 20px;
+  left: 50%;
+  transform: translateX(-50%);
+  z-index: 9999;
+}
+
+.toast_content {
+  background-color: rgba(0, 0, 0, 0.7);
+  color: #FFFFFF;
+  padding: 10px 20px;
+  border-radius: 10px;
+  font-size: 14px;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  animation: fadeInOut 2s ease-in-out;
+}
+
+@keyframes fadeInOut {
+  0% {
+    opacity: 0;
+    transform: translateY(-20px);
+  }
+  10% {
+    opacity: 1;
+    transform: translateY(0);
+  }
+  90% {
+    opacity: 1;
+    transform: translateY(0);
+  }
+  100% {
+    opacity: 0;
+    transform: translateY(-20px);
+  }
+}
+</style>

+ 4 - 4
src/components/pages/pptEasy/dialog/VideoUploadDialog2.vue

@@ -248,7 +248,7 @@ export default {
 	flex: 1;
 	max-width: 200px;
 	padding: 15px 20px;
-	border: 1px solid #e5e7eb;
+	border: 2px solid #e5e7eb;
 	border-radius: 8px;
 	display: flex;
 	flex-direction: column;
@@ -260,8 +260,8 @@ export default {
 }
 
 .source-option:hover {
-	background-color: #fffdfa;
-	border-color: #fffdfa;
+	background-color: #fff8f0;
+	border-color: #f8963c;
 	color: #FF9300;
 	box-shadow: 0 2px 8px rgba(40, 92, 245, 0.1);
 }
@@ -286,7 +286,7 @@ export default {
 
 .option-text {
 	font-size: 16px;
-	font-weight: 500;
+	font-weight: 600;
 	color: #333;
 	text-align: center;
 }

+ 1 - 0
src/components/pages/sassPlatform/view/tableView.vue

@@ -705,6 +705,7 @@ export default {
 
 .tv_bottom {
   width: 100%;
+  min-height: 200px;
   height: calc(100% - 100px);
   overflow: auto;
   padding: 0 20px;

+ 79 - 21
src/components/pages/test/checkAi/aiLeader.vue

@@ -308,6 +308,7 @@
           <div class="pageCount">
             <span>共{{ course.length }}条</span>
             <el-pagination
+              v-if="gotype != 'bjspersonTop'"
               background
               layout="prev, pager, next"
               :page-size="pageSize"
@@ -684,6 +685,7 @@ export default {
   data() {
     return {
       stype: 1,
+      gotype: window.topU && window.topU.gotype ? window.topU.gotype : '',
       typeArray: [],
       array: [],
       jArray: [],
@@ -1152,11 +1154,37 @@ ${fileText}
       let params = {
         oid: this.oid
       };
+      let list = [
+          "3823a6a5-1b6e-11f0-a66a-005056924926",
+          "292e34dc-1b6e-11f0-a66a-005056924926",
+          "21d6b367-1b6e-11f0-a66a-005056924926",
+          "1a1a172d-1b6e-11f0-a66a-005056924926",
+          "1197f86b-1b6e-11f0-a66a-005056924926",
+          "f235659b-1b6d-11f0-a66a-005056924926",
+          "d87b62d3-1b6d-11f0-a66a-005056924926",
+          "c25ea59b-1b6d-11f0-a66a-005056924926",
+        ]
+      let jk = 'selectTestType'
+      if (list.includes(this.org)) {
+        jk = 'selectTestType_liYuan'
+      } 
       this.ajax
-        .get(this.$store.state.api + "selectTestType", params)
+        .get(this.$store.state.api + jk, params)
         .then(res => {
-          this.typeArray = res.data[0];
-          this.getData();
+          try {
+            if (this.gotype == 'bjspersonTop') {
+              this.typeArray = res.data[0].filter(e => e.pid == "ce4f1224-37a5-11f1-bcd9-005056924926");
+              this.getData();
+            } else {
+              this.typeArray = res.data[0];
+              this.getData();
+            }
+          } catch (error) {
+            console.error(error);
+            this.typeArray = res.data[0];
+            this.getData();
+          }
+          
         })
         .catch(err => {
           console.error(err);
@@ -1242,24 +1270,54 @@ ${fileText}
     },
     getCourse() {
       this.isLoading = true;
-      let params = {
-        type: this.groupA,
-        uid: this.userid,
-        oid: this.oid,
-        org: this.org,
-        typea: "",
-        typeb: "",
-        typec: "",
-        typed: "",
-        typef: this.typeCheck,
-        typeE: "",
-        cu: "",
-        cn: this.courseName,
-        page: this.page,
-        pageSize: this.pageSize
-      };
+      // let params = {
+      //   type: this.groupA,
+      //   uid: this.userid,
+      //   oid: this.oid,
+      //   org: this.org,
+      //   typea: "",
+      //   typeb: "",
+      //   typec: "",
+      //   typed: "",
+      //   typef: this.typeCheck,
+      //   typeE: "",
+      //   cu: "",
+      //   cn: this.courseName,
+      //   page: this.page,
+      //   pageSize: this.pageSize
+      // };
+
+      let params = {}
+
+      if (this.gotype == 'bjspersonTop') {
+        params = {
+          uid: this.userid,
+          type: 0,
+          oid: this.oid,
+          org: this.org,
+          typeId: this.typeCheck ? this.typeCheck : 'ce4f1224-37a5-11f1-bcd9-005056924926',
+          textValue: this.courseName || ''
+        }
+      }else{
+        params = {
+          type: this.groupA,
+          uid: this.userid,
+          oid: this.oid,
+          org: this.org,
+          typea: "",
+          typeb: "",
+          typec: "",
+          typed: "",
+          typef: this.typeCheck,
+          typeE: "",
+          cu: "",
+          cn: this.courseName,
+          page: this.page,
+          pageSize: this.pageSize
+        };
+      }
       this.ajax
-        .get(this.$store.state.api + "selectTesttCourse", params)
+        .get(this.$store.state.api + (this.gotype == 'bjspersonTop' ? 'selectTesttCourse_sass' : "selectTesttCourse"), params)
         .then(res => {
           console.log("API返回的数据", res.data);
           this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
@@ -2816,7 +2874,7 @@ ${_echartsType[type].text}
     // 		this.setJson(el)
     // 	})
     // }
-    // this.selectTestType();
+    this.selectTestType();
     // 添加初始消息
     this.array.push({
       uid: "", // 生成唯一 ID

+ 1 - 0
src/components/pages/testStudent/view/preview.vue

@@ -528,6 +528,7 @@ export default {
            if(this.back==1){
             return this.$router.back()
           }
+          if (this.gotype) return this.$router.go(-1)
           // this.goTo(
           //   "/testStudent?userid=" +
           //   this.userid +

+ 69 - 19
src/components/pages/workPage/components/setChoiceQuestion.vue

@@ -2,7 +2,7 @@
   <div class="setChoiceQuestion">
     <div class="testItem" v-for="(item, index) in jsonData.testJson" :key="item.id">
       <div class="ti_header">
-        <span>{{ lang.ssTopic }}{{ index + 1 }} <span v-if="item.answer.length==0">{{lang.ssNoSettingAnswer}}</span></span>
+        <span>{{ lang.ssTopic }}{{ index + 1 }} <span v-if="item.answer.length==0 || item.checkList.some(opt=>!opt)">{{lang.ssNoSettingAnswer}}</span></span>
         <div class="ti_h_edit">
           <span @click="copyTest(item.id)">
             <svg viewBox="0 0 1024 1024" version="1.1" p-id="4608" width="200" height="200">
@@ -13,7 +13,7 @@
           </span>
 
           <!-- 上 -->
-          <span @click="changeIndex(item, index, 'up')">
+          <span :class="{'disabled': index === 0}" @click="changeIndex(item, index, 'up')">
             <svg viewBox="0 0 1024 1024" width="200" height="200" fill="#6B7280">
               <path
                 d="M959.804421 511.603981l-84.009346 84.023672L576.143391 293.406446l0 665.582911L448.20351 958.989357 448.20351 293.406446 147.619594 595.628676l-84.024695-84.023672L512.213359 63.546292 959.804421 511.603981z">
@@ -21,7 +21,7 @@
             </svg>
           </span>
           <!-- 下 -->
-          <span @click="changeIndex(item, index, 'down')">
+          <span :class="{'disabled': index === jsonData.testJson.length - 1}" @click="changeIndex(item, index, 'down')">
             <svg style="transform: rotate(180deg);" viewBox="0 0 1024 1024" width="200" height="200" fill="#6B7280">
               <path
                 d="M959.804421 511.603981l-84.009346 84.023672L576.143391 293.406446l0 665.582911L448.20351 958.989357 448.20351 293.406446 147.619594 595.628676l-84.024695-84.023672L512.213359 63.546292 959.804421 511.603981z">
@@ -41,8 +41,7 @@
       </div>
 
       <div class="ti_title">
-        <div class="ti_t_input" contenteditable="true" v-text="item.teststitle"
-          @blur="setTestTitle(item.id, $event.target.innerText)"></div>
+        <el-input class="ti_t_input" type="textarea" v-model="item.teststitle" :rows="3" :autosize="{ minRows: 3, maxRows: 6 }" resize="none" :placeholder="lang.ssEnterTextTitle" @input="setTestTitle(item.id)"></el-input>
         <div class="uploadImage" @click="uploadImage(item.id)">
           <svg viewBox="0 0 1024 1024" version="1.1" p-id="15953" width="200" height="200">
             <path
@@ -73,7 +72,7 @@
             @dragover.prevent="dragOver($event, item, checkIndex)"
             @drop="drop($event, item, checkIndex)"
             @dragend="dragEnd">
-          <div class="drag">
+          <div class="drag" draggable="true" @dragstart="dragStart($event, item, checkIndex)">
             <svg viewBox="0 0 1024 1024" width="200" height="200">
               <path
                 d="M867.995 459.647h-711.99c-27.921 0-52.353 24.434-52.353 52.353s24.434 52.353 52.353 52.353h711.99c27.921 0 52.353-24.434 52.353-52.353s-24.434-52.353-52.353-52.353z"
@@ -96,7 +95,7 @@
             </svg>
           </div>
           <el-input v-model="item.checkList[checkIndex]" :placeholder="lang.ssEnterOption"
-            @blur="setTestJson()"></el-input>
+            @input="setTestJson()"></el-input>
           <div class="btn">
 
             <div @click="addCheck(item.id, checkIndex)">
@@ -143,7 +142,7 @@
           </div>
         </div>
         <el-input type="textarea" rows="3" style="font-size: 1.2rem;" resize="none" v-model="item.explanation"
-          :placeholder="lang.ssEnterExplanation" @blur="setTestJson()"></el-input>
+          :placeholder="lang.ssEnterExplanation" @input="setTestJson()"></el-input>
       </div>
     </div>
 
@@ -175,7 +174,8 @@ export default {
   data() {
     return {
       jsonData: {},
-      dragItem: null
+      dragItem: null,
+      delJson:null,
     }
   },
   watch: {
@@ -222,12 +222,12 @@ export default {
       this.setTestJson();
     },
     //修改标题
-    setTestTitle(id, title) {
-      console.log('修改标题', id, title)
-      let test = this.jsonData.testJson.find(item => item.id == id);
-      if (test) {
-        test.teststitle = title;
-      }
+    setTestTitle(id, target) {
+      // let title = target.innerText;
+      // let test = this.jsonData.testJson.find(item => item.id == id);
+      // if (test) {
+      //   test.teststitle = title;
+      // }
       this.setTestJson();
     },
     // 点击复选框
@@ -244,6 +244,7 @@ export default {
     },
     // 删除题目
     deleteTest(id) {
+      this.delJson = JSON.stringify(this.jsonData.testJson);
       let index = this.jsonData.testJson.findIndex(item => item.id == id);
       this.jsonData.testJson.splice(index, 1);
       this.setTestJson();
@@ -312,14 +313,14 @@ export default {
       if (test) {
         if (direction == 'up') {
           if (index == 0) {
-            this.$message.info("已到顶部");
+            //this.$message.info("已到顶部");
             return;
           }
           this.jsonData.testJson.splice(index, 1);
           this.jsonData.testJson.splice(index - 1, 0, JSON.parse(JSON.stringify(test)));
         } else if (direction == 'down') {
           if (index == this.jsonData.testJson.length - 1) {
-            this.$message.info("已到底部");
+            //this.$message.info("已到底部");
             return;
           }
           this.jsonData.testJson.splice(index, 1);
@@ -330,6 +331,11 @@ export default {
     },
     // 拖拽相关方法
     dragStart(e, item, checkIndex) {
+      if (!e.target.closest('.drag')) {
+        e.preventDefault();
+        return;
+      }
+      console.log('e',e)
       this.dragItem = { item, checkIndex };
       const checkItem = e.target.closest('.checkItem');
       if (checkItem) checkItem.classList.add('dragging');
@@ -409,6 +415,21 @@ export default {
       });
       this.dragItem = null;
     },
+    // ctrl+z 撤销删除
+    undoDelete() {
+      if (this.delJson) {
+        this.jsonData.testJson = JSON.parse(this.delJson);
+        this.setTestJson();
+        this.delJson = null;
+      }
+    },
+  },
+  mounted() {
+    window.addEventListener('keydown', (e)=>{
+      if (e.ctrlKey && e.key === 'z') {
+        this.undoDelete();
+      }
+    });
   },
 }
 </script>
@@ -503,6 +524,13 @@ export default {
   fill: #6B7280;
 }
 
+.ti_h_edit>.disabled {
+  cursor: not-allowed;
+  opacity: 0.5;
+}
+
+
+
 .ti_title {
   width: 100%;
   height: fit-content;
@@ -524,11 +552,25 @@ export default {
   background: none;
   font-size: 1.2rem;
   resize: none;
-  max-height: 10rem;
+  /* max-height: 10rem; */
   overflow: auto;
   /* padding-right: 2rem; */
 }
 
+.ti_t_input /deep/ .el-textarea__inner {
+  padding: 0;
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+  border: none;
+  outline: none;
+  background: none;
+  font-size: 1.2rem;
+  resize: none;
+  /* max-height: 10rem; */
+  overflow: auto;
+}
+
 .uploadImage {
   position: absolute;
   bottom: 0.5rem;
@@ -627,7 +669,11 @@ export default {
 
 .checkItem>.el-input {
   width: calc(100% - 10rem);
-  font-size: 1.4rem;
+  font-size: 1.2rem;
+}
+
+.checkItem>.el-input /deep/ .el-input__inner:focus {
+  border-color: #FF935A !important;
 }
 
 .addCheck {
@@ -698,6 +744,10 @@ export default {
   border-radius: .8rem;
 }
 
+.explanation /deep/ .el-textarea__inner:focus {
+  border-color: #FF935A !important;
+}
+
 .e_header {
   display: flex;
   align-items: center;

+ 2 - 2
src/components/pages/workPage/components/setQuestionsAndAnswers.vue

@@ -7,7 +7,7 @@
 
       <div class="ti_title">
         <div class="ti_t_input" contenteditable="true" v-text="jsonData.answerQ"
-          @blur="setTestTitle($event.target.innerText)"></div>
+          @input="setTestTitle($event.target.innerText)"></div>
         <div class="uploadImage" @click="uploadImage()">
           <svg viewBox="0 0 1024 1024" version="1.1" p-id="15953" width="200" height="200">
             <path
@@ -72,7 +72,7 @@
           </div> -->
         </div>
         <el-input type="textarea" rows="3" resize="none" v-model="jsonData.evaluationCriteria" :placeholder="lang.ssEnterEvaluationStandard"
-          @blur="setTestJson()"></el-input>
+          @input="setTestJson()"></el-input>
       </div>
     </div>
 

+ 2 - 2
src/components/pages/workPage/setIndex.vue

@@ -74,7 +74,7 @@ export default {
       this.saveTest();
     },
     // 保存
-    saveTest(){
+    saveTest: _.debounce(function() {
       const params = [{
         uid: this.userid || '',
         id: this.workData.id,
@@ -90,7 +90,7 @@ export default {
         console.log("保存失败",err);
         // this.$message.error("保存失败");
       })
-    }
+    }, 500)
   },
   mounted() {
     this.getWorkData();

+ 18 - 1
src/router/index.js

@@ -156,7 +156,8 @@ import userInfoL from '@/components/pages/liyuan/page/userInfoL'
 import examineL from '@/components/pages/liyuan/page/examine'
 import examineperson from "@/components/pages/liyuan/page/examineperson";
 import studentManageNew from '@/components/pages/studentManageNew'
-
+import bjspersonTop from '@/components/pages/liyuan/bjspersonTop'
+import courseCenter from '@/components/pages/liyuan/page/courseCenter'
 import portraitL from '@/components/pages/liyuan/page/portrait'
 import teadTest from '@/components/pages/liyuan/page/teadTest'
 import Listudent from '@/components/pages/liyuan/page/student'
@@ -252,6 +253,22 @@ export default new Router({
       requireAuth: ''
     }
   },
+  {
+    path: '/courseCenter',
+    name: 'courseCenter',
+    component: courseCenter,
+    meta: {
+      requireAuth: ''
+    }
+  },
+  {
+    path: '/bjspersonTop',
+    name: 'bjspersonTop',
+    component: bjspersonTop,
+    meta: {
+      requireAuth: ''
+    }
+  },
   // {
   //   path: '/',
   //   redirect: '/course',

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä