dsy hace 1 semana
padre
commit
8a961f2b81

+ 10 - 0
src/api/project.js

@@ -164,6 +164,16 @@ export function SetProjectMember(data) {
 }
 
 /**
+ * @description 设置项目组长
+ * @param {object} data
+ * @param {string} data.project_id 项目ID
+ * @param {string} data.user_id_list 成员用户 ID 列表
+ */
+export function SetProjectLeader(data) {
+  return http.post(`${process.env.VUE_APP_EepServer}?MethodName=project_manager-SetProjectLeader`, data);
+}
+
+/**
  * @description 添加审校批注
  * @param {object} data
  * @param {string} data.courseware_id 课件ID

+ 3 - 3
src/api/user.js

@@ -35,7 +35,7 @@ export function getMyUserInfo() {
 
 // 更改我的用户密码
 export function updatePwd(data) {
-  return http.post(`${process.env.VUE_APP_EepServer}?MethodName=user_manager-UpdateMyUserPassword`,data);
+  return http.post(`${process.env.VUE_APP_EepServer}?MethodName=user_manager-UpdateMyUserPassword`, data);
 }
 
 // 得到邮箱配置
@@ -45,5 +45,5 @@ export function getSysConfigMailbox() {
 
 // 设置邮箱配置
 export function setSysConfigMailbox(data) {
-  return http.post(`${process.env.VUE_APP_EepServer}?MethodName=sys_config_manager-SetSysConfig_Mailbox`,data);
-}
+  return http.post(`${process.env.VUE_APP_EepServer}?MethodName=sys_config_manager-SetSysConfig_Mailbox`, data);
+}

+ 31 - 2
src/components/CommonPreview.vue

@@ -22,10 +22,12 @@
     </div>
 
     <div class="audit-content">
-      <!-- 左侧菜单栏 - 收缩 -->
+      <!-- 左侧菜单栏  -->
       <aside v-if="navigationShow" class="left-menu">
         <div class="courseware-info">
-          <div class="cover-image"></div>
+          <div class="cover-image">
+            <img v-if="project.cover_image_file_url.length > 0" :src="project.cover_image_file_url" alt="" />
+          </div>
           <div class="info-content">
             <div class="catalogue-icon">
               <SvgIcon icon-class="catalogue" size="54" />
@@ -34,6 +36,14 @@
               <div class="name nowrap-ellipsis" :title="courseware_info.book_name">
                 {{ courseware_info.book_name }}
               </div>
+              <div>
+                <span>主编 </span>
+                <span>{{ project.editor }}</span>
+              </div>
+              <div>
+                <span>副主编 </span>
+                <span>{{ project.associate_editor }}</span>
+              </div>
             </div>
           </div>
         </div>
@@ -224,6 +234,7 @@ import {
   GetCoursewareAuditRemarkList,
   AddCoursewareAuditRemark,
   DeleteCoursewareAuditRemarkList,
+  GetProjectInfo,
 } from '@/api/project';
 import {
   ContentGetCoursewareContent_View,
@@ -360,6 +371,12 @@ export default {
       curSelectId: this.id,
       navigationShow: true,
       sidebarShow: true,
+      project: {
+        editor: '', // 主编
+        associate_editor: '', // 副主编
+        cover_image_file_id: null, // 封面图片ID
+        cover_image_file_url: '', // 封面图片URL
+      },
     };
   },
   computed: {
@@ -391,6 +408,7 @@ export default {
     }
     this.getBookChapterStructExpandList();
     this.getBookUnifiedAttr();
+    this.getProjectInfo();
   },
   mounted() {
     this.calcDrawerPosition();
@@ -408,6 +426,12 @@ export default {
       });
     },
 
+    getProjectInfo() {
+      GetProjectInfo({ id: this.projectId }).then(({ project_info }) => {
+        this.project = project_info;
+      });
+    },
+
     /**
      * 得到教材课件信息
      * @param {string} id - 课件ID
@@ -930,6 +954,11 @@ $total-width: $courseware-width + $courseware-left-margin + $courseware-right-ma
           width: 111px;
           height: 157px;
           background-color: rgba(229, 229, 229, 100%);
+
+          img {
+            width: 100%;
+            height: 100%;
+          }
         }
 
         .info-content {

+ 1 - 1
src/views/book/courseware/preview/CoursewarePreview.vue

@@ -387,7 +387,7 @@ export default {
   row-gap: $component-spacing;
   width: 100%;
   height: 100%;
-  min-height: 500px;
+  min-height: calc(100vh - 226px);
   padding-top: $courseware-top-padding;
   padding-bottom: $courseware-bottom-padding;
   margin: 15px 0;

+ 0 - 4
src/views/book/courseware/preview/components/dialogue_article/NormalModelChs.vue

@@ -247,7 +247,6 @@
                             class="NNPE-pinyin"
                             :class="[noFont.indexOf(item.wordsList[pIndex + 1].pinyin) > -1 ? 'noFont' : '']"
                             style="text-align: left"
-                            style="text-align: left"
                             :style="{
                               fontSize: attrib && attrib.pinyin_size ? attrib.pinyin_size : '14px',
                               height:
@@ -316,7 +315,6 @@
                             class="NNPE-pinyin"
                             :class="[noFont.indexOf(item.wordsList[pIndex + 1].pinyin) > -1 ? 'noFont' : '']"
                             style="text-align: left"
-                            style="text-align: left"
                             :style="{
                               fontSize: attrib && attrib.pinyin_size ? attrib.pinyin_size : '14px',
                               height:
@@ -352,7 +350,6 @@
                               noFont.indexOf(item.wordsList[pIndex + 2].pinyin) > -1 ? 'noFont' : '',
                             ]"
                             style="text-align: left"
-                            style="text-align: left"
                             :style="{
                               fontSize: attrib && attrib.pinyin_size ? attrib.pinyin_size : '14px',
                               height:
@@ -423,7 +420,6 @@
                               noFont.indexOf(item.wordsList[pIndex + 2].pinyin) > -1 ? 'noFont' : '',
                             ]"
                             style="text-align: left"
-                            style="text-align: left"
                             :style="{
                               fontSize: attrib && attrib.pinyin_size ? attrib.pinyin_size : '14px',
                               height:

+ 136 - 21
src/views/create_project/createProject.vue

@@ -17,30 +17,60 @@
       <el-form-item label="项目分类" prop="category">
         <el-input v-model="project.category" maxlength="30" />
       </el-form-item>
-      <el-form-item label="作品标签" prop="label_list" class="label-input">
-        <div class="label-input-content">
-          <div class="label-list">
-            <el-tag
-              v-for="(tag, index) in project.label_list"
-              :key="index"
-              closable
-              @close="project.label_list.splice(index, 1)"
-            >
-              {{ tag }}
-            </el-tag>
+      <el-form-item label="教材封面" class="cover-image">
+        <div class="upload-image">
+          <el-upload
+            class="avatar-uploader"
+            action="no"
+            :http-request="upload"
+            :before-upload="beforeUpload"
+            accept="image/*"
+            :show-file-list="false"
+          >
+            <img v-if="imageUrl" :src="imageUrl" class="avatar" />
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+          </el-upload>
+        </div>
+        <div class="project-info">
+          <div class="project-item">
+            <label>语种</label>
+            <el-input v-model="project.language" type="text" placeholder="请输入语种" maxlength="20" />
+          </div>
+          <div class="project-item">
+            <label>出版单位</label>
+            <el-input v-model="project.publisher" type="text" placeholder="请输入出版单位" maxlength="20" />
+          </div>
+          <div class="project-item label-input">
+            <label>作品标签</label>
+            <div class="label-input-content">
+              <div class="label-list">
+                <el-tag
+                  v-for="(tag, index) in project.label_list"
+                  :key="index"
+                  closable
+                  @close="project.label_list.splice(index, 1)"
+                >
+                  {{ tag }}
+                </el-tag>
+              </div>
+              <el-input v-model="labelInput" placeholder="请输入标签" @keyup.enter.native="labelChange" />
+            </div>
+          </div>
+          <div class="project-item">
+            <label>所属课题</label>
+            <el-input v-model="project.topic" type="text" placeholder="请输入所属课题" />
+          </div>
+
+          <div class="project-item">
+            <label>主编</label>
+            <el-input v-model="project.editor" type="text" placeholder="请输入主编" maxlength="20" />
+          </div>
+          <div class="project-item">
+            <label>副主编</label>
+            <el-input v-model="project.associate_editor" type="text" placeholder="请输入副主编" maxlength="20" />
           </div>
-          <el-input v-model="labelInput" placeholder="请输入标签" @keyup.enter.native="labelChange" />
         </div>
       </el-form-item>
-      <el-form-item label="语种" prop="language">
-        <el-input v-model="project.language" type="text" placeholder="请输入语种" maxlength="20" />
-      </el-form-item>
-      <el-form-item label="所属课题" prop="topic">
-        <el-input v-model="project.topic" type="text" placeholder="请输入所属课题" />
-      </el-form-item>
-      <el-form-item label="出版单位" prop="publisher">
-        <el-input v-model="project.publisher" type="text" placeholder="请输入出版单位" maxlength="20" />
-      </el-form-item>
       <el-form-item label="内容简介" prop="content_intro">
         <el-input
           v-model="project.content_intro"
@@ -112,6 +142,7 @@
 
 <script>
 import { CreateProject } from '@/api/project';
+import { fileUpload } from '@/api/app';
 
 import selectMembers from './selectProjectMembers.vue';
 
@@ -144,7 +175,11 @@ export default {
         reader: '', // 读者对象
         leader_id_list: [], // 组长列表
         member_id_list: [], // 组员列表
+        cover_image_file_id: '', // 封面图片文件ID
+        editor: '', // 主编
+        associate_editor: '', // 副主编
       },
+      imageUrl: '', // 封面图片URL
       formRules: {
         name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
       },
@@ -198,6 +233,25 @@ export default {
         this.project.member_id_list = selectedUsers.map((user) => user.id);
       }
     },
+    beforeUpload(file) {
+      const isImage = /^image/.test(file.type);
+      if (!isImage) {
+        this.$message.error('上传的文件不是图片,请重新上传!');
+      }
+      return isImage;
+    },
+    upload(file) {
+      if (file.file.size / 1048576 > 2) {
+        return this.$message.warning(`${file.file.name}文件大小超出限制`);
+      }
+      fileUpload('Open', file, { isGlobalprogress: true }).then(({ file_info_list }) => {
+        if (file_info_list.length > 0) {
+          const { file_url, file_id } = file_info_list[0];
+          this.imageUrl = file_url;
+          this.project.cover_image_file_id = file_id;
+        }
+      });
+    },
   },
 };
 </script>
@@ -236,6 +290,67 @@ export default {
       }
     }
 
+    .cover-image {
+      display: block;
+
+      :deep .el-form-item__content {
+        display: inline-flex;
+
+        .upload-image {
+          .avatar-uploader {
+            .el-upload {
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              width: 418px;
+              height: 280px;
+              overflow: hidden;
+              cursor: pointer;
+              border: 1px dashed #d9d9d9;
+              border-radius: 6px;
+
+              &:hover {
+                border-color: #409eff;
+              }
+            }
+
+            &-icon {
+              width: 418px;
+              height: 280px;
+              font-size: 28px;
+              line-height: 280px;
+              color: #8c939d;
+              text-align: center;
+            }
+
+            .avatar {
+              display: block;
+              max-width: 418px;
+              max-height: 280px;
+            }
+          }
+        }
+
+        .project-info {
+          display: flex;
+          flex-direction: column;
+          row-gap: 18px;
+          margin-left: 10px;
+
+          .project-item {
+            display: flex;
+            align-items: center;
+
+            label {
+              width: 120px;
+              padding-right: 12px;
+              text-align: right;
+            }
+          }
+        }
+      }
+    }
+
     .label-input {
       max-width: 540px;
 

+ 119 - 14
src/views/personal_workbench/project/ProjectInfoManage.vue

@@ -26,13 +26,61 @@
           <span>{{ project.category }}</span>
           <span class="link">更改</span>
         </div>
-        <span class="label">作品标签</span>
+
+        <span class="label" style="line-height: 290px">教材封面</span>
         <div class="project-item">
-          <span>
-            <span v-for="(label, index) in project.label_list" :key="index">
-              {{ label }}{{ index < project.label_list.length - 1 ? ',' : '' }}
+          <div v-if="project.cover_image_file_url?.length > 0" class="cover-image">
+            <img :src="project.cover_image_file_url" alt="cover image" />
+          </div>
+          <div v-else></div>
+          <span class="link">更改</span>
+        </div>
+
+        <div class="label label-list">
+          <span>语种</span>
+          <span>出版单位</span>
+          <span>作品标签</span>
+          <span>所属课题</span>
+          <span>主编</span>
+          <span>副主编</span>
+        </div>
+        <div class="project-item info-list">
+          <div class="info-item">
+            <span>{{ project.language }}</span>
+            <span class="link">更改</span>
+          </div>
+
+          <div class="info-item">
+            <span>{{ project.publisher }}</span>
+            <span class="link">更改</span>
+          </div>
+
+          <div class="info-item">
+            <span>
+              <span v-for="(label, index) in project.label_list" :key="index">
+                {{ label }}{{ index < project.label_list.length - 1 ? ',' : '' }}
+              </span>
             </span>
-          </span>
+            <span class="link">更改</span>
+          </div>
+
+          <div class="info-item">
+            <span>{{ project.topic }}</span>
+            <span class="link">更改</span>
+          </div>
+
+          <div class="info-item">
+            <span>{{ project.editor }}</span>
+            <span class="link">更改</span>
+          </div>
+          <div class="info-item">
+            <span>{{ project.associate_editor }}</span>
+            <span class="link">更改</span>
+          </div>
+        </div>
+
+        <span class="label">作品标签</span>
+        <div class="project-item">
           <span class="link">更改</span>
         </div>
         <span class="label">语种</span>
@@ -45,11 +93,7 @@
           <span>{{ project.topic }}</span>
           <span class="link">更改</span>
         </div>
-        <span class="label">出版单位</span>
-        <div class="project-item">
-          <span>{{ project.publisher }}</span>
-          <span class="link">更改</span>
-        </div>
+
         <span class="label" style="line-height: 16px">预计容量<br />(课数)</span>
         <div class="project-item">
           <span>{{ project.content_count_YG }}</span>
@@ -120,7 +164,7 @@
 </template>
 
 <script>
-import { GetProjectInfo, SetProjectMember } from '@/api/project';
+import { GetProjectInfo, SetProjectMember, SetProjectLeader } from '@/api/project';
 import { GetUserList_ID } from '@/api/user';
 
 import selectMembers from '@/views/create_project/selectProjectMembers.vue';
@@ -159,11 +203,15 @@ export default {
         plan_publish_date: '', // 计划出版时间
         reader: '', // 读者对象
         leader_id_list: [], // 组长列表
+        leader_name_desc: '', // 组长名称描述
         member_id_list: [], // 组员列表
+        member_name_desc: '', // 组员名称描述
         creator_name: '', // 创建人名称
         create_time: '', // 创建时间
-        leader_name_desc: '', // 组长名称描述
-        member_name_desc: '', // 组员名称描述
+        editor: '', // 主编
+        associate_editor: '', // 副主编
+        cover_image_file_id: null, // 封面图片ID
+        cover_image_file_url: '', // 封面图片URL
       },
       formRules: {
         name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
@@ -205,6 +253,7 @@ export default {
     handleSelectedMembers(selectedUsers) {
       if (this.type === 'leader') {
         this.project.leader_id_list = selectedUsers.map((user) => user.id);
+        this.setProjectLeader();
       } else if (this.type === 'member') {
         this.project.member_id_list = selectedUsers.map((user) => user.id);
         this.setProjectMember();
@@ -219,8 +268,10 @@ export default {
       GetUserList_ID({ id_list }).then(({ user_list }) => {
         if (type === 'leader') {
           this.list.leader = user_list;
+          this.project.leader_name_desc = user_list.map((user) => user.user_name).join(',');
         } else if (type === 'member') {
           this.list.member = user_list;
+          this.project.member_name_desc = user_list.map((user) => user.user_name).join(',');
         }
       });
     },
@@ -234,6 +285,16 @@ export default {
         this.getProjectInfo();
       });
     },
+    // 设置项目组长
+    setProjectLeader() {
+      SetProjectLeader({
+        project_id: this.id,
+        user_id_list: this.project.leader_id_list,
+      }).then(() => {
+        this.$message.success('项目组长更新成功');
+        this.getProjectInfo();
+      });
+    },
   },
 };
 </script>
@@ -271,6 +332,13 @@ export default {
       .label {
         text-align: right;
         background-color: $fill-color;
+
+        &.label-list {
+          display: flex;
+          flex-direction: column;
+          row-gap: 18px;
+          padding: 12px 8px;
+        }
       }
 
       .project-item {
@@ -280,11 +348,48 @@ export default {
         :first-child {
           flex: 1;
         }
+
+        &.info-list {
+          flex-direction: column;
+          padding: 3px 8px;
+
+          :first-child {
+            flex: none;
+          }
+
+          .info-item {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            height: 50px;
+            padding: 9px 0;
+
+            &:not(:last-child) {
+              border-bottom: $border;
+            }
+          }
+        }
+
+        .cover-image {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          width: 373px;
+          height: 289px;
+          overflow: hidden;
+
+          img {
+            display: block;
+            flex: none;
+            max-width: 373px;
+            max-height: 289px;
+          }
+        }
       }
     }
 
     .table-fourcolumn {
-      grid-template-rows: repeat(7, minmax(40px, auto));
+      grid-template-rows: 40px 298px repeat(5, minmax(40px, auto));
       grid-template-columns: 120px 1fr 120px 1fr;
     }