Browse Source

1. ui组件问题修复
2. 课程/模板/选择模板列表加排序
3. 添加多语言翻译

dusenyao 2 years ago
parent
commit
20bbd148d1

+ 1 - 0
src/components/course/courseware.js

@@ -43,6 +43,7 @@ export function useShowCourseware(courseId, groupId = '[]', previewType = 'previ
 
         if (category.value === categoryList[4]) {
           themeColor.value = book_theme_color;
+          bookFontSize.value = book_font_size;
           context.value = JSON.parse(content);
           return;
         }

+ 2 - 1
src/components/live/CurMaterial.vue

@@ -222,7 +222,8 @@ export default {
               this.material_name = material_name;
               this.material_type = material_type;
               this.material_picture_url = material_picture_url;
-              this.courseware_group_id_selected_info = courseware_group_id_selected_info ?? '[]';
+              this.courseware_group_id_selected_info =
+                courseware_group_id_selected_info.length <= 0 ? '[]' : courseware_group_id_selected_info;
               clearInterval(this.timer);
               this.timer = null;
               this.curStudentID = '-';

+ 1 - 0
src/components/preview/PreviewCourse.vue

@@ -7,6 +7,7 @@
           ref="booknpc"
           task-model=""
           :is-show-save="false"
+          :is-show-title="false"
           :context="context"
           :theme-color="themeColor"
           :preview-type="previewType"

+ 19 - 6
src/components/select/SelectTemplate.vue

@@ -26,12 +26,14 @@
       :data="list"
       height="40vh"
       highlight-current-row
+      :default-sort="dataSort"
       @current-change="handleCurrentChange"
+      @sort-change="sortChange($event, queryCourseList)"
     >
-      <el-table-column prop="name" :label="$t('Key134')" width="150" />
-      <el-table-column prop="creator_name" :label="$t('Key280')" width="120" />
-      <el-table-column prop="org_name" :label="$t('Key136')" width="120" />
-      <el-table-column :label="$t('Key250')">
+      <el-table-column prop="name" :label="$t('Key134')" width="150" sortable="custom" />
+      <el-table-column prop="creator_name" :label="$t('Key280')" width="120" sortable="custom" />
+      <el-table-column prop="org_name" :label="$t('Key136')" width="120" sortable="custom" />
+      <el-table-column :label="$t('Key250')" sortable="custom" prop="begin_date">
         <template slot-scope="{ row }">
           <i class="el-icon-date"></i> {{ row.begin_date }} - {{ row.end_date }}
         </template>
@@ -93,7 +95,17 @@ let searchForm = ref({
   name: ''
 });
 
-let { cur_page, list, page_capacity, total_count, changePage, changePageSize } = useList();
+let {
+  cur_page,
+  list,
+  page_capacity,
+  total_count,
+  order_column_list,
+  dataSort,
+  changePage,
+  changePageSize,
+  sortChange
+} = useList(10, 'SelectTemplateSort');
 
 function queryCourseList() {
   const queryCriteria = {
@@ -101,7 +113,8 @@ function queryCourseList() {
     name: searchForm.value.name,
     page_capacity: page_capacity.value,
     cur_page: cur_page.value,
-    release_status: 1
+    release_status: 1,
+    order_column_list: order_column_list.value
   };
   PageQueryCourseList(queryCriteria).then(({ course_list, total_count: total }) => {
     list.value = course_list;

+ 3 - 1
src/locales/lang/AR.js

@@ -703,5 +703,7 @@ export default {
   Key696: 'رمز ترويجي غير صالح',
   Key697: 'الرمز الترويجي مستخدم بالفعل',
   Key698: 'تعيين رقم الهاتف',
-  Key699: 'رقم الهاتف خاطئ'
+  Key699: 'رقم الهاتف خاطئ',
+  Key804: 'الانضمام إلى الدولة',
+  Key805: 'تغطية مسبقا'
 };

+ 3 - 1
src/locales/lang/DE.js

@@ -705,5 +705,7 @@ export default {
   Key696: 'Ungültiger Fördercode',
   Key697: 'Fördercode bereits verwendet',
   Key698: 'Telefonnummer einstellen',
-  Key699: 'Falsches Format der Telefonnummer'
+  Key699: 'Falsches Format der Telefonnummer',
+  Key804: 'Beitrittsstatus',
+  Key805: 'Voreingestellte Abdeckung'
 };

+ 3 - 1
src/locales/lang/EN.js

@@ -703,5 +703,7 @@ export default {
   Key696: 'Invalid promo code',
   Key697: 'Promo code already used',
   Key698: 'Set phone number',
-  Key699: 'Wrong form of phone number'
+  Key699: 'Wrong form of phone number',
+  Key804: 'Join status',
+  Key805: 'Preset cover'
 };

+ 3 - 1
src/locales/lang/ES.js

@@ -707,5 +707,7 @@ export default {
   Key696: 'Código promocional inválido',
   Key697: 'Código promocional ya utilizado',
   Key698: 'Establecer número de teléfono',
-  Key699: 'Forma incorrecta del número de teléfono'
+  Key699: 'Forma incorrecta del número de teléfono',
+  Key804: 'Estado de adhesión',
+  Key805: 'Portada preestablecida'
 };

+ 3 - 1
src/locales/lang/FR.js

@@ -706,5 +706,7 @@ export default {
   Key696: 'Code promotionnel invalide',
   Key697: 'Code promotionnel déjà utilisé',
   Key698: 'Définir le numéro de téléphone',
-  Key699: 'Format du numéro de téléphone incorrect'
+  Key699: 'Format du numéro de téléphone incorrect',
+  Key804: "Statut d'adhésion",
+  Key805: 'Couverture pré - installée'
 };

+ 3 - 1
src/locales/lang/HI.js

@@ -718,5 +718,7 @@ export default {
   Key696: 'अमान्य प्रोमो कोड',
   Key697: 'प्रोमो कोड का पहले इस्तेमाल हो चुका है',
   Key698: 'फ़ोन नंबर सेट करें',
-  Key699: 'फ़ोन नंबर का गलत फॉर्म'
+  Key699: 'फ़ोन नंबर का गलत फॉर्म',
+  Key804: 'स्थिति में जोड़ें',
+  Key805: 'पूर्व सेट कवर'
 };

+ 3 - 1
src/locales/lang/JA.js

@@ -702,5 +702,7 @@ export default {
   Key696: 'クーポンコードは無効です',
   Key697: 'クーポンコードは使用されました',
   Key698: '携帯番号を設定する',
-  Key699: '携帯番号の形式は正しくありません'
+  Key699: '携帯番号の形式は正しくありません',
+  Key804: '参加ステータス',
+  Key805: 'プリセット表紙'
 };

+ 3 - 1
src/locales/lang/KO.js

@@ -702,5 +702,7 @@ export default {
   Key696: '할인 코드가 무효합니다',
   Key697: '할인 코드가 이미 사용되었습니다',
   Key698: '핸드폰 번호 설정',
-  Key699: '핸드폰 번호 서식이 정확하지 않습니다'
+  Key699: '핸드폰 번호 서식이 정확하지 않습니다',
+  Key804: '가입 상태',
+  Key805: '사전 설정 표지'
 };

+ 3 - 1
src/locales/lang/RU.js

@@ -707,5 +707,7 @@ export default {
   Key696: 'Недействительный промокод',
   Key697: 'Промокод уже использован',
   Key698: 'Настроить номер мобильного телефона',
-  Key699: 'Неверный формат номера мобильного телефона'
+  Key699: 'Неверный формат номера мобильного телефона',
+  Key804: 'Статус присоединения',
+  Key805: 'Предустановка обложки'
 };

+ 3 - 1
src/locales/lang/TH.js

@@ -704,5 +704,7 @@ export default {
   Key696: 'รหัสส่วนลดไม่ถูกต้อง',
   Key697: 'รหัสส่วนลดถูกนำไปใช้แล้ว',
   Key698: 'ตั้งค่าหมายเลขโทรศัพท์',
-  Key699: 'รูปแบบโทรศัพท์ไม่ถูกต้อง'
+  Key699: 'รูปแบบโทรศัพท์ไม่ถูกต้อง',
+  Key804: 'สถานะการเข้าร่วม',
+  Key805: 'ปกที่ตั้งไว้ล่วงหน้า'
 };

+ 3 - 1
src/locales/lang/ZH.js

@@ -702,5 +702,7 @@ export default {
   Key696: '优惠码无效',
   Key697: '优惠码已被使用',
   Key698: '设置手机号',
-  Key699: '手机号格式不正确'
+  Key699: '手机号格式不正确',
+  Key804: '加入状态',
+  Key805: '预置封面'
 };

+ 35 - 3
src/utils/list.js

@@ -1,30 +1,62 @@
-import { ref } from 'vue';
+import { ref, computed } from 'vue';
 
 /**
  * 列表公用数据和方法
+ * @param {Number} capacity 每页容量
+ * @param {String} storageName 本地存储名称
  */
-export function useList(capacity = 10) {
+export function useList(capacity = 10, storageName) {
   let page_capacity = ref(capacity); // 每页容量
   let cur_page = ref(1); // 当前页
   let total_count = ref(0); // 总记录数
   let list = ref([]); // 列表
+  let dataSort = ref(JSON.parse(localStorage.getItem(storageName)) || {});
+  // 排序列
+  let order_column_list = computed(() => {
+    let { prop, order } = dataSort.value;
+    return prop ? [`${prop}${order === 'descending' ? ':desc' : ''}`] : [];
+  });
 
+  /**
+   * 改变页数
+   * @param {Number} newPage
+   * @param {Function} fn
+   */
   function changePage(newPage, fn) {
     cur_page.value = newPage;
     fn();
   }
 
+  /**
+   * 改变每页容量
+   * @param {Number} pageSize
+   * @param {Function} fn
+   */
   function changePageSize(pageSize, fn) {
     page_capacity.value = pageSize;
     fn();
   }
 
+  /**
+   * 表格排序
+   * @param {Object} data
+   * @param {Function} fn
+   */
+  function sortChange({ order, prop }, fn) {
+    dataSort.value = order ? { prop, order } : {};
+    localStorage.setItem(storageName, JSON.stringify(dataSort.value));
+    fn();
+  }
+
   return {
     page_capacity,
     cur_page,
     total_count,
     list,
+    order_column_list,
+    dataSort,
     changePage,
-    changePageSize
+    changePageSize,
+    sortChange
   };
 }

+ 1 - 1
src/views/course_details/index.vue

@@ -550,7 +550,7 @@ function preview(fId, fType, goods_id, group_id_selected_info) {
       }
       fileId.value = fId;
       fileType.value = fType;
-      previewGroupId.value = group_id_selected_info ?? '[]';
+      previewGroupId.value = group_id_selected_info.length <= 0 ? '[]' : group_id_selected_info;
       visible.value = true;
     });
   }

+ 2 - 1
src/views/live/teacher/CompleteList.vue

@@ -211,7 +211,8 @@ export default {
             this.material_name = material_name;
             this.material_type = material_type;
             this.material_picture_url = material_picture_url;
-            this.courseware_group_id_selected_info = courseware_group_id_selected_info ?? '[]';
+            this.courseware_group_id_selected_info =
+              courseware_group_id_selected_info.length <= 0 ? '[]' : courseware_group_id_selected_info;
           }
         }
       );

+ 18 - 7
src/views/main/TemplateList.vue

@@ -28,9 +28,9 @@
         </el-button>
       </div>
       <div class="template-container-list">
-        <el-table :data="list">
-          <el-table-column prop="name" :label="$t('Key134')" width="320" />
-          <el-table-column :label="$t('Key250')" width="210">
+        <el-table :data="list" :default-sort="dataSort" @sort-change="sortChange($event, queryCourseList)">
+          <el-table-column prop="name" :label="$t('Key134')" width="320" sortable="custom" />
+          <el-table-column :label="$t('Key250')" width="210" sortable="custom" prop="begin_date">
             <template slot-scope="{ row }">
               <i class="el-icon-date"></i> {{ row.begin_date }} - {{ row.end_date }}
             </template>
@@ -40,8 +40,8 @@
               {{ row.is_release === 'true' ? '√' : '' }}
             </template>
           </el-table-column>
-          <el-table-column :label="$t('Key136')" width="280" prop="org_name" />
-          <el-table-column :label="$t('Key280')" prop="creator_name" />
+          <el-table-column :label="$t('Key136')" width="280" prop="org_name" sortable="custom" />
+          <el-table-column :label="$t('Key280')" prop="creator_name" sortable="custom" />
 
           <el-table-column fixed="right" width="80">
             <template slot-scope="{ row: { id, is_release } }">
@@ -119,7 +119,17 @@ const releaseStatusList = [
   }
 ];
 
-let { page_capacity, cur_page, total_count, list, changePage, changePageSize } = useList();
+let {
+  page_capacity,
+  cur_page,
+  total_count,
+  list,
+  order_column_list,
+  dataSort,
+  changePage,
+  changePageSize,
+  sortChange
+} = useList(10, 'teacherTemplateSort');
 
 function queryCourseList() {
   PageQueryCourseList({
@@ -127,7 +137,8 @@ function queryCourseList() {
     name: template_name.value,
     page_capacity: page_capacity.value,
     cur_page: cur_page.value,
-    release_status: release_status.value
+    release_status: release_status.value,
+    order_column_list: order_column_list.value
   }).then(({ course_list, total_count: total }) => {
     list.value = course_list;
     total_count.value = total;

+ 1 - 2
src/views/main/curricula_list/student.vue

@@ -62,8 +62,7 @@
               </span>
             </template>
           </el-table-column>
-          <!-- TODO 翻译 -->
-          <el-table-column label="加入状态">
+          <el-table-column :label="$t('Key804')">
             <template slot-scope="{ row }">
               <span>{{ row.buy_status_name }}</span>
             </template>

+ 18 - 7
src/views/main/curricula_list/teacher.vue

@@ -36,9 +36,9 @@
         </div>
       </div>
       <div class="curricula-teacher-container-list">
-        <el-table :data="list">
-          <el-table-column prop="name" :label="$t('Key134')" width="320" />
-          <el-table-column :label="$t('Key250')" width="210">
+        <el-table :data="list" :default-sort="dataSort" @sort-change="sortChange($event, queryMyCourseList)">
+          <el-table-column prop="name" :label="$t('Key134')" width="320" sortable="custom" />
+          <el-table-column :label="$t('Key250')" width="210" sortable="custom" prop="begin_date">
             <template slot-scope="{ row }">
               <i class="el-icon-date"></i> {{ row.begin_date }} - {{ row.end_date }}
             </template>
@@ -48,8 +48,8 @@
               {{ row.is_release === 'true' ? '√' : '' }}
             </template>
           </el-table-column>
-          <el-table-column :label="$t('Key136')" width="280" prop="org_name" />
-          <el-table-column :label="$t('Key280')" prop="creator_name" />
+          <el-table-column :label="$t('Key136')" width="280" prop="org_name" sortable="custom" />
+          <el-table-column :label="$t('Key280')" prop="creator_name" sortable="custom" />
           <el-table-column fixed="right" width="80">
             <template slot-scope="{ row }">
               <el-dropdown trigger="click">
@@ -129,7 +129,17 @@ GetFinishStatusList_Course().then(({ finish_status_list: list }) => {
 });
 
 // 列表及查询条件
-let { page_capacity, cur_page, total_count, list, changePage, changePageSize } = useList();
+let {
+  page_capacity,
+  cur_page,
+  total_count,
+  list,
+  order_column_list,
+  dataSort,
+  changePage,
+  changePageSize,
+  sortChange
+} = useList(10, 'teacherCourseSort');
 let search = ref('');
 let finish_status = ref(-1);
 function queryMyCourseList(course_id = '', type) {
@@ -139,7 +149,8 @@ function queryMyCourseList(course_id = '', type) {
     page_capacity: page_capacity.value,
     release_status: -1,
     course_id: type === 'select' ? course_id : '',
-    cur_page: cur_page.value
+    cur_page: cur_page.value,
+    order_column_list: order_column_list.value
   }).then(({ course_list, total_count: total }) => {
     list.value = course_list;
     total_count.value = total;

+ 2 - 1
src/views/new_live/teacher/components/CompleteList.vue

@@ -211,7 +211,8 @@ export default {
             this.material_name = material_name;
             this.material_type = material_type;
             this.material_picture_url = material_picture_url;
-            this.courseware_group_id_selected_info = courseware_group_id_selected_info ?? '[]';
+            this.courseware_group_id_selected_info =
+              courseware_group_id_selected_info.length <= 0 ? '[]' : courseware_group_id_selected_info;
           }
         }
       );

+ 2 - 2
src/views/new_live/teacher/group.vue

@@ -166,8 +166,8 @@ const { stopGroup } = useGroup();
 
 function getMyGroupInfo_Teacher() {
   GetMyGroupInfo_Teacher({ task_id }).then(({ student_list: sList }) => {
-    noStreamList.value = sList ?? [];
-    student_list.value = sList ?? [];
+    noStreamList.value = sList;
+    student_list.value = sList;
   });
 }
 

+ 2 - 1
src/views/task_details/ShowCourseware.vue

@@ -43,7 +43,8 @@ export default {
     return {
       coursewareId: this.$route.params.coursewareId,
       previewType: 'previewCheckShow',
-      group_id_selected_info: this.$route.query.group_id_selected_info ?? '[]',
+      group_id_selected_info:
+        this.$route.query.group_id_selected_info.length <= 0 ? '[]' : this.$route.query.group_id_selected_info,
       context: null,
       previewWidth: window.screen.width,
       previewHeight: window.screen.height,

+ 1 - 1
src/views/task_details/student/index.vue

@@ -370,7 +370,7 @@ function finishTask(id, is_finished, group_id_selected_info) {
   if (my_execute_info.value.is_finished === 'true' && is_finished === 'false') {
     return Message.error($t('Key338'));
   }
-  previewGroupId.value = group_id_selected_info ?? '[]';
+  previewGroupId.value = group_id_selected_info.length <= 0 ? '[]' : group_id_selected_info;
   if (is_finished === 'true') {
     dialogVisible_completion.value = true;
     curCoursewareId.value = id;

+ 1 - 1
src/views/task_details/teacher/index.vue

@@ -258,7 +258,7 @@ let dialogVisible = ref(false);
 let curCoursewareId = ref('');
 function showCompletionView(id, is_finished, group_id_selected_info) {
   if (is_finished === 'false') return Message.warning($t('Key338'));
-  previewGroupId.value = group_id_selected_info ?? '[]';
+  previewGroupId.value = group_id_selected_info.length <= 0 ? '[]' : group_id_selected_info;
   curCoursewareId.value = id;
   dialogVisible.value = true;
 }

+ 34 - 6
src/views/teacher/create_course/step_four/NewTask.vue

@@ -260,7 +260,7 @@ export default {
 import { ref, provide, inject } from 'vue';
 import { AddTaskToCSItem, UpdateTask } from '@/api/course';
 import { useRoute, useRouter } from 'vue-router/composables';
-import { useForm, useInit, useCourse, basicForm, courseForm, liveForm } from './newTask';
+import { useForm, useInit, useCourse } from './newTask';
 import { curry } from '@/utils/common';
 
 import SelectCourse from '@/components/select/SelectCourse.vue';
@@ -279,13 +279,38 @@ provide('cs_item_id', cs_item_id);
 // 任务所属课节
 const curItemID = params.curItemID;
 
-const { form, rules, closeFile, upload, custom_student_list, deleteStudentItem, selectStudent, student_list } =
-  useForm();
+let liveForm = ref({
+  coursewareInfo: [],
+  file_info_list: [],
+  courseware_visible_mode: 21,
+  zhibo_record_mode: 32
+});
+
+let courseForm = ref({
+  coursewareInfo: [],
+  task_mode: 'PRACTICE',
+  is_enable_message: true
+});
+
+let basicForm = ref({
+  file_info_list: [],
+  is_enable_homework: true,
+  is_enable_message: true
+});
+
+const { form, rules, closeFile, upload, custom_student_list, deleteStudentItem, selectStudent, student_list } = useForm(
+  liveForm,
+  basicForm
+);
 
 const { cs_item_begin_time, cs_item_end_time, mode_list, teacher_list, time_type, type_list, hourArr, minuteArr } =
-  useInit(form, student_list, custom_student_list);
+  useInit(form, student_list, custom_student_list, { liveForm, basicForm, courseForm });
 
-const { dialogVisible, changeCourseName, closeCourse, dialogClose, selectCourse } = useCourse(form);
+const { dialogVisible, changeCourseName, closeCourse, dialogClose, selectCourse } = useCourse(
+  form,
+  liveForm,
+  courseForm
+);
 
 let newTaskForm = ref();
 /**
@@ -341,7 +366,10 @@ function addTaskToCSItem() {
       data['is_enable_message'] = courseForm.value.is_enable_message;
       data['courseware_group_selected_list'] = courseForm.value.coursewareInfo.map(
         ({ courseware_id, group_id_selected_info }) => {
-          return { courseware_id, group_id_selected_info: group_id_selected_info ?? '[]' };
+          return {
+            courseware_id,
+            group_id_selected_info: group_id_selected_info.length <= 0 ? '[]' : group_id_selected_info
+          };
         }
       );
       // 当前自定义名称列表

+ 3 - 22
src/views/teacher/create_course/step_four/newTask.js

@@ -8,31 +8,12 @@ import { fileTypeSizeLimit } from '@/utils/validate';
 
 import i18n from '@/locales/i18n';
 
-export let liveForm = ref({
-  coursewareInfo: [],
-  file_info_list: [],
-  courseware_visible_mode: 21,
-  zhibo_record_mode: 32
-});
-
-export let courseForm = ref({
-  coursewareInfo: [],
-  task_mode: 'PRACTICE',
-  is_enable_message: true
-});
-
-export let basicForm = ref({
-  file_info_list: [],
-  is_enable_homework: true,
-  is_enable_message: true
-});
-
 const allStudent = {
   student_id: '',
   student_name: i18n.t('Key110')
 };
 
-export function useInit(form, student_list, custom_student_list) {
+export function useInit(form, student_list, custom_student_list, { liveForm, basicForm, courseForm }) {
   const route = useRoute();
   const { params, query } = route;
   const task_id = query.task_id;
@@ -186,7 +167,7 @@ export function useInit(form, student_list, custom_student_list) {
 /**
  * 表单及操作
  */
-export function useForm() {
+export function useForm(liveForm, basicForm) {
   const $t = inject('$t');
   const route = useRoute();
   const { query } = route;
@@ -289,7 +270,7 @@ export function useForm() {
  * 选择课件
  * @param {Object} form
  */
-export function useCourse(form) {
+export function useCourse(form, liveForm, courseForm) {
   const $t = inject('$t');
 
   let dialogVisible = ref(false);

+ 1 - 1
src/views/teacher/create_course/step_one/CourseInfo.vue

@@ -22,7 +22,7 @@
             <el-image v-if="form.imageUrl" fit="contain" :src="form.imageUrl" class="avatar" />
             <i v-else class="el-icon-plus avatar-uploader-icon"></i>
           </el-upload>
-          <span class="select-cover" @click="showCover">{{ '预置封面' }}</span>
+          <span class="select-cover" @click="showCover">{{ $t('Key805') }}</span>
         </el-form-item>
 
         <el-form-item :label="$t('Key134')" prop="name">

+ 9 - 2
src/views/teacher/create_course/step_three/components/task_template/components/courseware.js

@@ -23,7 +23,10 @@ export function useCourseware(curTemplateData) {
   // 课件分组选择列表
   let courseware_group_selected_list = computed(() => {
     return courseList.value.map(({ courseware_id, group_id_selected_info }) => {
-      return { courseware_id, group_id_selected_info: group_id_selected_info ?? '[]' };
+      return {
+        courseware_id,
+        group_id_selected_info: group_id_selected_info.length <= 0 ? '[]' : group_id_selected_info
+      };
     });
   });
   watch(
@@ -72,7 +75,11 @@ export function useSelectCourseware() {
     visibleSelectCourse.value = false;
 
     GetTreeNodeInfo_BookChapterStruct({ id: course_id }).then(({ name, id }) => {
-      courseFn({ courseware_name: name, courseware_id: id, group_id_selected_info: previewGroupId ?? '[]' });
+      courseFn({
+        courseware_name: name,
+        courseware_id: id,
+        group_id_selected_info: previewGroupId.length <= 0 ? '[]' : previewGroupId
+      });
     });
   }
 

+ 1 - 1
src/views/teacher/create_course/step_three_old/createTask.js

@@ -262,7 +262,7 @@ export function usePreview() {
     if (fType === 'courseware') {
       fileId.value = fId;
       fileType.value = fType;
-      previewGroupId.value = group_id_selected_info ?? '[]';
+      previewGroupId.value = group_id_selected_info.length <= 0 ? '[]' : group_id_selected_info;
       visible.value = true;
     }