Browse Source

接口修改,富文本合并

dusenyao 1 month ago
parent
commit
9ff52ebadd

+ 11 - 0
package-lock.json

@@ -24,6 +24,7 @@
         "simple-mind-map": "^0.14.0-fix.1",
         "simple-mind-map": "^0.14.0-fix.1",
         "three": "^0.178.0",
         "three": "^0.178.0",
         "tinymce": "^5.10.9",
         "tinymce": "^5.10.9",
+        "v-fit-columns": "^0.2.0",
         "vue": "^2.6.14",
         "vue": "^2.6.14",
         "vue-esign": "^1.1.4",
         "vue-esign": "^1.1.4",
         "vue-router": "^3.6.5",
         "vue-router": "^3.6.5",
@@ -20009,6 +20010,11 @@
         "node": ">=8"
         "node": ">=8"
       }
       }
     },
     },
+    "node_modules/v-fit-columns": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/v-fit-columns/-/v-fit-columns-0.2.0.tgz",
+      "integrity": "sha512-xR0jIFmTyJeg4VZgEx7z8BIijZnHQegtbwAhG3L3TmyAoq/TXk7H6vzFLNxAVzOj9pSpO/0B2mf7jmuO2nE4Ag=="
+    },
     "node_modules/validate-npm-package-license": {
     "node_modules/validate-npm-package-license": {
       "version": "3.0.4",
       "version": "3.0.4",
       "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
       "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -35857,6 +35863,11 @@
         "sade": "^1.7.3"
         "sade": "^1.7.3"
       }
       }
     },
     },
+    "v-fit-columns": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/v-fit-columns/-/v-fit-columns-0.2.0.tgz",
+      "integrity": "sha512-xR0jIFmTyJeg4VZgEx7z8BIijZnHQegtbwAhG3L3TmyAoq/TXk7H6vzFLNxAVzOj9pSpO/0B2mf7jmuO2nE4Ag=="
+    },
     "validate-npm-package-license": {
     "validate-npm-package-license": {
       "version": "3.0.4",
       "version": "3.0.4",
       "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
       "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",

BIN
src/assets/header/home_logo.png


+ 1 - 1
src/components/MathDialog.vue

@@ -54,7 +54,7 @@ import {
   onlyAlignMacros,
   onlyAlignMacros,
   commonMacros,
   commonMacros,
   categoryList,
   categoryList,
-} from '@/views/book/courseware/data/describe';
+} from '@/views/book/courseware/data/richText';
 
 
 export default {
 export default {
   name: 'MathDialog',
   name: 'MathDialog',

+ 1 - 0
src/icons/svg/components/richtext.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753441956864" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2349" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M712.145455 316.509091h-390.981819c-18.618182 0-37.236364 13.963636-37.236363 37.236364s18.618182 37.236364 37.236363 37.236363h158.254546v344.436364c0 18.618182 18.618182 37.236364 37.236363 37.236363s37.236364-18.618182 37.236364-37.236363v-344.436364h158.254546c18.618182 0 37.236364-18.618182 37.236363-37.236363s-18.618182-37.236364-37.236363-37.236364z" p-id="2350"></path><path d="M842.472727 51.2h-665.6c-69.818182 0-130.327273 60.509091-130.327272 130.327273v665.6c0 69.818182 60.509091 130.327273 130.327272 130.327272h665.6c74.472727 0 130.327273-55.854545 130.327273-130.327272V176.872727c0-69.818182-55.854545-125.672727-130.327273-125.672727z m60.509091 795.927273c0 32.581818-23.272727 55.854545-55.854545 55.854545h-665.6c-32.581818 0-55.854545-23.272727-55.854546-55.854545V176.872727c0-32.581818 23.272727-55.854545 55.854546-55.854545h665.6c32.581818 0 55.854545 23.272727 55.854545 55.854545v670.254546z" p-id="2351"></path></svg>

+ 9 - 1
src/layouts/home/header/index.vue

@@ -1,7 +1,8 @@
 <template>
 <template>
   <header class="header">
   <header class="header">
     <div class="logo" @click="$router.push('/home')">
     <div class="logo" @click="$router.push('/home')">
-      <el-image class="logo-image" :src="require('../../../assets/gcls_logo.png')" />
+      <el-image class="logo-image" :src="require('../../../assets/header/home_logo.png')" />
+      <h3>智慧梧桐数字教材编辑器</h3>
     </div>
     </div>
 
 
     <div v-if="!token" class="selectLoginOrRegistration">
     <div v-if="!token" class="selectLoginOrRegistration">
@@ -66,7 +67,10 @@ export default {
   border-bottom: 1px solid #ebebeb;
   border-bottom: 1px solid #ebebeb;
 
 
   .logo {
   .logo {
+    display: flex;
     flex: 1;
     flex: 1;
+    column-gap: 12px;
+    align-items: center;
     height: 48px;
     height: 48px;
     margin-right: 36px;
     margin-right: 36px;
     cursor: pointer;
     cursor: pointer;
@@ -74,6 +78,10 @@ export default {
     &-image {
     &-image {
       height: 100%;
       height: 100%;
     }
     }
+
+    h3 {
+      color: $font-color;
+    }
   }
   }
 
 
   .user {
   .user {

+ 3 - 3
src/views/book/courseware/create/components/base/describe/Describe.vue → src/views/book/courseware/create/components/base/rich_text/RichText.vue

@@ -22,7 +22,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { getDescribeData } from '@/views/book/courseware/data/describe';
+import { getRichTextData } from '@/views/book/courseware/data/richText';
 import { CrateParsedTextInfo_Pinyin } from '@/api/book';
 import { CrateParsedTextInfo_Pinyin } from '@/api/book';
 import { isEnable } from '@/views/book/courseware/data/common';
 import { isEnable } from '@/views/book/courseware/data/common';
 
 
@@ -31,13 +31,13 @@ import PinyinText from '@/components/PinyinText.vue';
 import DOMPurify from 'dompurify';
 import DOMPurify from 'dompurify';
 
 
 export default {
 export default {
-  name: 'DescribePage',
+  name: 'RichTextPage',
   components: { PinyinText },
   components: { PinyinText },
   mixins: [ModuleMixin],
   mixins: [ModuleMixin],
   data() {
   data() {
     return {
     return {
       isEnable,
       isEnable,
-      data: getDescribeData(),
+      data: getRichTextData(),
       selectContent: '',
       selectContent: '',
       richId: '',
       richId: '',
     };
     };

+ 3 - 3
src/views/book/courseware/create/components/base/describe/DescribeSetting.vue → src/views/book/courseware/create/components/base/rich_text/RichTextSetting.vue

@@ -33,10 +33,10 @@
 <script>
 <script>
 import SettingMixin from '@/views/book/courseware/create/components/common/SettingMixin';
 import SettingMixin from '@/views/book/courseware/create/components/common/SettingMixin';
 import { isEnable, viewMethodList, pinyinPositionList } from '@/views/book/courseware/data/common';
 import { isEnable, viewMethodList, pinyinPositionList } from '@/views/book/courseware/data/common';
-import { getDescribeProperty } from '@/views/book/courseware/data/describe';
+import { getRichTextProperty } from '@/views/book/courseware/data/richText';
 
 
 export default {
 export default {
-  name: 'DescribeSetting',
+  name: 'RichTextSetting',
   mixins: [SettingMixin],
   mixins: [SettingMixin],
   data() {
   data() {
     return {
     return {
@@ -44,7 +44,7 @@ export default {
       viewMethodList,
       viewMethodList,
       pinyinPositionList,
       pinyinPositionList,
       labelPosition: 'left',
       labelPosition: 'left',
-      property: getDescribeProperty(),
+      property: getRichTextProperty(),
       selectContent: '',
       selectContent: '',
       visible: false,
       visible: false,
       content: '',
       content: '',

+ 6 - 2
src/views/book/courseware/create/components/common/SelectUpload.vue

@@ -16,7 +16,7 @@
         <el-button>{{ showText }}</el-button>
         <el-button>{{ showText }}</el-button>
       </el-upload>
       </el-upload>
       <el-button size="small" class="upload-button" type="primary" @click="uploadFiles">上传</el-button>
       <el-button size="small" class="upload-button" type="primary" @click="uploadFiles">上传</el-button>
-      <el-button size="small" type="primary" @click="useResource">使用资源</el-button>
+      <el-button v-if="isShowResource" size="small" type="primary" @click="useResource">使用资源</el-button>
     </div>
     </div>
     <SelectResource
     <SelectResource
       :visible.sync="visibleResource"
       :visible.sync="visibleResource"
@@ -34,10 +34,10 @@ import SelectResource from '../base/common/SelectResource.vue';
 
 
 export default {
 export default {
   name: 'SelectUpload',
   name: 'SelectUpload',
-  inject: ['courseware_id', 'project_id'],
   components: {
   components: {
     SelectResource,
     SelectResource,
   },
   },
+  inject: ['courseware_id', 'project_id'],
   props: {
   props: {
     type: {
     type: {
       type: String,
       type: String,
@@ -59,6 +59,10 @@ export default {
       type: Number,
       type: Number,
       default: 999,
       default: 999,
     },
     },
+    isShowResource: {
+      type: Boolean,
+      default: true,
+    },
   },
   },
   data() {
   data() {
     return {
     return {

+ 99 - 66
src/views/book/courseware/create/components/question/voice_matrix/VoiceMatrix.vue

@@ -1,40 +1,61 @@
 <template>
 <template>
   <ModuleBase :type="data.type">
   <ModuleBase :type="data.type">
     <template #content>
     <template #content>
-      <span class="link" @click="BatchSetFormat('bold')">批量设置粗体</span>
-      <div class="option-list">
-        <div v-for="(item, i) in data.option_list" :key="i" class="voice-matrix">
-          <div v-for="li in item" :key="li.mark" class="matrix-item">
-            <!-- eslint-disable max-len -->
-            <RichText
-              ref="richText"
-              v-model="li.content"
-              :inline="true"
-              toolbar="fontselect fontsizeselect forecolor backcolor | underline | bold italic strikethrough alignleft aligncenter alignright"
-            />
+      <div class="container">
+        <span class="link" @click="BatchSetFormat('bold')">批量设置粗体</span>
+
+        <div class="option-list">
+          <div v-for="(item, i) in data.option_list" :key="i" class="voice-matrix">
+            <div v-for="li in item" :key="li.mark" class="matrix-item">
+              <!-- eslint-disable max-len -->
+              <RichText
+                ref="richText"
+                v-model="li.content"
+                :inline="true"
+                toolbar="fontselect fontsizeselect forecolor backcolor | underline | bold italic strikethrough alignleft aligncenter alignright"
+              />
+            </div>
           </div>
           </div>
         </div>
         </div>
-      </div>
 
 
-      <SelectUpload label="矩阵音频" type="audio" width="500px" @uploadSuccess="uploadAudioSuccess" />
-      <div v-if="data.audio_data.url.length > 0" class="upload-file">
-        <div class="file-name">
-          <span>
-            <SvgIcon icon-class="note" size="12" />
-            <span>{{ data.audio_data.name }}</span>
-          </span>
+        <SelectUpload
+          label="矩阵音频"
+          type="audio"
+          width="600px"
+          :is-show-resource="false"
+          @uploadSuccess="uploadAudioSuccess"
+        />
+        <div v-if="data.audio_data.url.length > 0" class="upload-file">
+          <div class="file-name">
+            <span>
+              <SvgIcon icon-class="note" size="12" />
+              <span>{{ data.audio_data.name }}</span>
+            </span>
+          </div>
+          <SvgIcon icon-class="delete-black" size="12" @click="removeFile('audio')" />
         </div>
         </div>
-        <SvgIcon icon-class="delete-black" size="12" @click="removeFile('audio')" />
-      </div>
-      <SelectUpload label="lrc 文件" :limit="1" type="lrc" width="500px" @uploadSuccess="uploadLrcSuccess" />
-      <div v-if="data.lrc_data.url.length > 0" class="upload-file">
-        <div class="file-name">
-          <span>
-            <SvgIcon icon-class="note" size="12" />
-            <span>{{ data.lrc_data.name }}</span>
-          </span>
+
+        <div class="upload-lrc">
+          <SelectUpload
+            label="音频字幕(lrc)文件"
+            :limit="1"
+            type="lrc"
+            width="500px"
+            :is-show-resource="false"
+            @uploadSuccess="uploadLrcSuccess"
+          />
+          <el-button size="small" type="primary">校对字幕</el-button>
+        </div>
+
+        <div v-if="data.lrc_data.url.length > 0" class="upload-file">
+          <div class="file-name">
+            <span>
+              <SvgIcon icon-class="note" size="12" />
+              <span>{{ data.lrc_data.name }}</span>
+            </span>
+          </div>
+          <SvgIcon icon-class="delete-black" size="12" @click="removeFile('lrc')" />
         </div>
         </div>
-        <SvgIcon icon-class="delete-black" size="12" @click="removeFile('lrc')" />
       </div>
       </div>
     </template>
     </template>
   </ModuleBase>
   </ModuleBase>
@@ -176,60 +197,72 @@ export default {
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-.option-list {
-  margin-bottom: 12px;
+.container {
+  display: flex;
+  flex-direction: column;
+  row-gap: 8px;
 
 
-  .voice-matrix {
-    display: flex;
-    row-gap: 16px;
+  .option-list {
+    margin-bottom: 12px;
 
 
-    + .voice-matrix {
-      margin-top: 16px;
-    }
-
-    .matrix-item {
-      flex: 1;
-      min-width: 75px;
-      padding: 8px;
-      border: 1px solid $border-color;
+    .voice-matrix {
+      display: flex;
+      row-gap: 16px;
 
 
-      &:not(:last-child) {
-        border-right: 0;
+      + .voice-matrix {
+        margin-top: 16px;
       }
       }
 
 
-      :deep p {
-        margin: 0;
+      .matrix-item {
+        flex: 1;
+        min-width: 75px;
+        padding: 8px;
+        border: 1px solid $border-color;
+
+        &:not(:last-child) {
+          border-right: 0;
+        }
+
+        :deep p {
+          margin: 0;
+        }
       }
       }
     }
     }
   }
   }
-}
 
 
-.upload-file {
-  display: flex;
-  column-gap: 12px;
-  align-items: center;
-  margin: 8px 0;
-
-  .file-name {
+  .upload-file {
     display: flex;
     display: flex;
-    column-gap: 14px;
+    column-gap: 12px;
     align-items: center;
     align-items: center;
-    justify-content: space-between;
-    max-width: 360px;
-    padding: 8px 12px;
-    font-size: 14px;
-    color: #1d2129;
-    background-color: #f7f8fa;
-
-    span {
+    margin: 8px 0;
+
+    .file-name {
       display: flex;
       display: flex;
       column-gap: 14px;
       column-gap: 14px;
       align-items: center;
       align-items: center;
+      justify-content: space-between;
+      max-width: 360px;
+      padding: 8px 12px;
+      font-size: 14px;
+      color: #1d2129;
+      background-color: #f7f8fa;
+
+      span {
+        display: flex;
+        column-gap: 14px;
+        align-items: center;
+      }
+    }
+
+    .svg-icon {
+      cursor: pointer;
     }
     }
   }
   }
 
 
-  .svg-icon {
-    cursor: pointer;
+  .upload-lrc {
+    display: flex;
+    column-gap: 12px;
+    align-items: center;
   }
   }
 }
 }
 </style>
 </style>

+ 21 - 21
src/views/book/courseware/data/bookType.js

@@ -11,10 +11,10 @@ import SelectPage from '../create/components/question/select/Select.vue';
 import SelectSetting from '../create/components/question/select/SelectSetting.vue';
 import SelectSetting from '../create/components/question/select/SelectSetting.vue';
 import VideoPage from '../create/components/base/video/Video.vue';
 import VideoPage from '../create/components/base/video/Video.vue';
 import VideoSetting from '../create/components/base/video/VideoSetting.vue';
 import VideoSetting from '../create/components/base/video/VideoSetting.vue';
-import StemPage from '../create/components/base/stem/Stem.vue';
-import StemSetting from '../create/components/base/stem/StemSetting.vue';
-import DescribePage from '../create/components/base/describe/Describe.vue';
-import DescribeSetting from '../create/components/base/describe/DescribeSetting.vue';
+// import StemPage from '../create/components/base/stem/Stem.vue';
+// import StemSetting from '../create/components/base/stem/StemSetting.vue';
+import RichTextPage from '../create/components/base/rich_text/RichText.vue';
+import RichTextSetting from '../create/components/base/rich_text/RichTextSetting.vue';
 import LabelPage from '../create/components/base/label/Label.vue';
 import LabelPage from '../create/components/base/label/Label.vue';
 import LabelSetting from '../create/components/base/label/LabelSetting.vue';
 import LabelSetting from '../create/components/base/label/LabelSetting.vue';
 import MatchingPage from '../create/components/question/matching/Matching.vue';
 import MatchingPage from '../create/components/question/matching/Matching.vue';
@@ -74,8 +74,8 @@ import DividerPreview from '@/views/book/courseware/preview/components/divider/D
 // import SpacingPreview from '@/views/book/courseware/preview/components/spacing/SpacingPreview.vue';
 // import SpacingPreview from '@/views/book/courseware/preview/components/spacing/SpacingPreview.vue';
 import PicturePreview from '@/views/book/courseware/preview/components/picture/PicturePreview.vue';
 import PicturePreview from '@/views/book/courseware/preview/components/picture/PicturePreview.vue';
 import VideoPreview from '@/views/book/courseware/preview/components/video/VideoPreview.vue';
 import VideoPreview from '@/views/book/courseware/preview/components/video/VideoPreview.vue';
-import StemPreview from '@/views/book/courseware/preview/components/stem/StemPreview.vue';
-import DescribePreview from '@/views/book/courseware/preview/components/describe/DescribePreview.vue';
+// import StemPreview from '@/views/book/courseware/preview/components/stem/StemPreview.vue';
+import DescribePreview from '@/views/book/courseware/preview/components/rich_text/RichTextPreview.vue';
 import LabelPreview from '@/views/book/courseware/preview/components/label/LabelPreview.vue';
 import LabelPreview from '@/views/book/courseware/preview/components/label/LabelPreview.vue';
 import SelectPreview from '@/views/book/courseware/preview/components/select/SelectPreview.vue';
 import SelectPreview from '@/views/book/courseware/preview/components/select/SelectPreview.vue';
 import MatchingPreview from '@/views/book/courseware/preview/components/matching/MatchingPreview.vue';
 import MatchingPreview from '@/views/book/courseware/preview/components/matching/MatchingPreview.vue';
@@ -110,21 +110,21 @@ export const bookTypeOption = [
     value: 'base',
     value: 'base',
     label: '基础组件',
     label: '基础组件',
     children: [
     children: [
+      // {
+      //   value: 'stem',
+      //   label: '题干',
+      //   icon: 'stem',
+      //   component: StemPage,
+      //   // 设置页面
+      //   set: StemSetting,
+      //   preview: StemPreview, // 预览页面
+      // },
       {
       {
-        value: 'stem',
-        label: '题干',
-        icon: 'stem',
-        component: StemPage,
-        // 设置页面
-        set: StemSetting,
-        preview: StemPreview, // 预览页面
-      },
-      {
-        value: 'describe',
-        label: '描述',
-        icon: 'describe',
-        component: DescribePage,
-        set: DescribeSetting,
+        value: 'richtext',
+        label: '富文本',
+        icon: 'richtext',
+        component: RichTextPage,
+        set: RichTextSetting,
         preview: DescribePreview,
         preview: DescribePreview,
       },
       },
       {
       {
@@ -357,7 +357,7 @@ export const bookTypeOption = [
         set: ImageTextSetting,
         set: ImageTextSetting,
         preview: ImageTextPreview,
         preview: ImageTextPreview,
       },
       },
-        {
+      {
         value: 'table',
         value: 'table',
         label: '表格',
         label: '表格',
         icon: '',
         icon: '',

+ 6 - 6
src/views/book/courseware/data/describe.js → src/views/book/courseware/data/richText.js

@@ -446,7 +446,7 @@ export const categoryList = {
   others: '其他',
   others: '其他',
 };
 };
 
 
-export function getDescribeProperty() {
+export function getRichTextProperty() {
   return {
   return {
     serial_number: 1, // 序号
     serial_number: 1, // 序号
     sn_type: serialNumberTypeList[0].value, // 序号类型:letter字母 number数字  capital大写字母 bracket_number括号数字
     sn_type: serialNumberTypeList[0].value, // 序号类型:letter字母 number数字  capital大写字母 bracket_number括号数字
@@ -460,10 +460,10 @@ export function getDescribeProperty() {
   };
   };
 }
 }
 
 
-export function getDescribeData() {
+export function getRichTextData() {
   return {
   return {
-    type: 'describe',
-    title: '描述',
+    type: 'richtext',
+    title: '富文本',
     content: '',
     content: '',
     paragraph_list: [],
     paragraph_list: [],
     paragraph_list_parameter: {
     paragraph_list_parameter: {
@@ -471,9 +471,9 @@ export function getDescribeData() {
       is_first_sentence_first_hz_pinyin_first_char_upper_case: 'true',
       is_first_sentence_first_hz_pinyin_first_char_upper_case: 'true',
       pinyin_proofread_word_list: [],
       pinyin_proofread_word_list: [],
     },
     },
-    property: getDescribeProperty(),
+    property: getRichTextProperty(),
     mind_map: {
     mind_map: {
-      node_list: [{ name: '描述' }],
+      node_list: [{ name: '富文本' }],
     },
     },
   };
   };
 }
 }

+ 3 - 3
src/views/book/courseware/preview/components/describe/DescribePreview.vue → src/views/book/courseware/preview/components/rich_text/RichTextPreview.vue

@@ -14,19 +14,19 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { getDescribeData } from '@/views/book/courseware/data/describe';
+import { getRichTextData } from '@/views/book/courseware/data/richText';
 import PreviewMixin from '../common/PreviewMixin';
 import PreviewMixin from '../common/PreviewMixin';
 import { isEnable } from '@/views/book/courseware/data/common';
 import { isEnable } from '@/views/book/courseware/data/common';
 import PinyinText from '@/components/PinyinText.vue';
 import PinyinText from '@/components/PinyinText.vue';
 
 
 export default {
 export default {
-  name: 'DescribePreview',
+  name: 'RichTextPreview',
   components: { PinyinText },
   components: { PinyinText },
   mixins: [PreviewMixin],
   mixins: [PreviewMixin],
   data() {
   data() {
     return {
     return {
       isEnable,
       isEnable,
-      data: getDescribeData(),
+      data: getRichTextData(),
     };
     };
   },
   },
   methods: {},
   methods: {},

+ 15 - 3
src/views/personal_workbench/project/ProductionEditorialManage.vue

@@ -31,7 +31,7 @@
           <span class="title-cell">操作</span>
           <span class="title-cell">操作</span>
         </div>
         </div>
         <div
         <div
-          v-for="{ id, name, deep, producer_list, is_leaf_chapter, auditor_desc } in node_list"
+          v-for="{ id, name, deep, producer_list, is_leaf_chapter, is_root, auditor_desc } in node_list"
           :key="id"
           :key="id"
           :class="['catalogue', { active: curSelectId === id }]"
           :class="['catalogue', { active: curSelectId === id }]"
           @click="selectActiveChapter(id, is_leaf_chapter === 'true')"
           @click="selectActiveChapter(id, is_leaf_chapter === 'true')"
@@ -49,10 +49,19 @@
           <div class="audit nowrap-ellipsis" :title="auditor_desc">{{ auditor_desc }}</div>
           <div class="audit nowrap-ellipsis" :title="auditor_desc">{{ auditor_desc }}</div>
           <div class="status"></div>
           <div class="status"></div>
           <div class="operator">
           <div class="operator">
-            <span class="link" @click="openUpdateNameDialog(id, name, is_leaf_chapter === 'true')">修改</span>
+            <span
+              v-if="is_root !== 'true'"
+              class="link"
+              @click="openUpdateNameDialog(id, name, is_leaf_chapter === 'true')"
+              >修改</span
+            >
             <span class="link" @click="openSetProducer(id)">设置制作人</span>
             <span class="link" @click="openSetProducer(id)">设置制作人</span>
             <span class="link" @click="openSetAuditor(id)">设置审校人</span>
             <span class="link" @click="openSetAuditor(id)">设置审校人</span>
-            <span class="link danger" @click="is_leaf_chapter === 'true' ? deleteCourseware(id) : deleteChapter(id)">
+            <span
+              v-if="is_root !== 'true'"
+              class="link danger"
+              @click="is_leaf_chapter === 'true' ? deleteCourseware(id) : deleteChapter(id)"
+            >
               删除
               删除
             </span>
             </span>
           </div>
           </div>
@@ -83,6 +92,7 @@
 
 
     <SetAuditor
     <SetAuditor
       :id="auditor.id"
       :id="auditor.id"
+      :book-id="book_id"
       :visible.sync="auditor.visible"
       :visible.sync="auditor.visible"
       :member-list="member_list"
       :member-list="member_list"
       @close="getBookChapterStructExpandList"
       @close="getBookChapterStructExpandList"
@@ -174,6 +184,7 @@ export default {
     /**
     /**
      * 得到教材章节结构展开列表
      * 得到教材章节结构展开列表
      * @param {string} book_id - 教材ID
      * @param {string} book_id - 教材ID
+     * @param {boolean} is_contain_root_node - 是否包含根节点
      * @param {number} node_deep_mode - 节点深度模式
      * @param {number} node_deep_mode - 节点深度模式
      * @param {boolean} is_contain_producer - 是否包含制作人
      * @param {boolean} is_contain_producer - 是否包含制作人
      */
      */
@@ -181,6 +192,7 @@ export default {
       ChapterGetBookChapterStructExpandList({
       ChapterGetBookChapterStructExpandList({
         book_id: this.book_id,
         book_id: this.book_id,
         node_deep_mode: 0,
         node_deep_mode: 0,
+        is_contain_root_node: 'true',
         is_contain_producer: 'true',
         is_contain_producer: 'true',
         is_contain_auditor: 'true',
         is_contain_auditor: 'true',
       }).then(({ node_list }) => {
       }).then(({ node_list }) => {

+ 7 - 3
src/views/personal_workbench/project/components/SetAuditor.vue

@@ -63,6 +63,10 @@ export default {
       type: Array,
       type: Array,
       default: () => [],
       default: () => [],
     },
     },
+    bookId: {
+      type: String,
+      default: '',
+    },
   },
   },
   data() {
   data() {
     return {
     return {
@@ -121,7 +125,7 @@ export default {
      * @param {Array<string>} param0.user_id_list - 用户ID列表
      * @param {Array<string>} param0.user_id_list - 用户ID列表
      */
      */
     setAuditor({ flow_node_id, user_id_list }) {
     setAuditor({ flow_node_id, user_id_list }) {
-      SetAuditor({ book_chapter_node_id: this.id, flow_node_id, user_id_list }).then(() => {
+      SetAuditor({ book_id: this.bookId, book_chapter_node_id: this.id, flow_node_id, user_id_list }).then(() => {
         this.$message.success('设置审校人成功');
         this.$message.success('设置审校人成功');
         this.getChapterNodeAuditorList();
         this.getChapterNodeAuditorList();
       });
       });
@@ -133,13 +137,13 @@ export default {
      * @param {string} param0.user_id - 用户ID
      * @param {string} param0.user_id - 用户ID
      */
      */
     setMainAuditor({ flow_node_id, user_id }) {
     setMainAuditor({ flow_node_id, user_id }) {
-      SetMainAuditor({ book_chapter_node_id: this.id, flow_node_id, user_id }).then(() => {
+      SetMainAuditor({ book_id: this.bookId, book_chapter_node_id: this.id, flow_node_id, user_id }).then(() => {
         this.$message.success('设置主审校人成功');
         this.$message.success('设置主审校人成功');
         this.getChapterNodeAuditorList();
         this.getChapterNodeAuditorList();
       });
       });
     },
     },
     getChapterNodeAuditorList() {
     getChapterNodeAuditorList() {
-      GetChapterNodeAuditorList({ book_chapter_node_id: this.id }).then(
+      GetChapterNodeAuditorList({ book_id: this.bookId, book_chapter_node_id: this.id }).then(
         ({ flow_node_list, chapter_node_name_path, auditor_desc }) => {
         ({ flow_node_list, chapter_node_name_path, auditor_desc }) => {
           this.flow_node_list = flow_node_list;
           this.flow_node_list = flow_node_list;
           this.chapter_node_name_path = chapter_node_name_path;
           this.chapter_node_name_path = chapter_node_name_path;