Browse Source

预览优化

dsy 1 month ago
parent
commit
19e30cd8c1

+ 1 - 1
.env

@@ -11,4 +11,4 @@ VUE_APP_BookWebSI = '/GCLSBookWebSI/ServiceInterface'
 VUE_APP_EepServer = '/EEPServer/SI'
 
 #version
-VUE_APP_VERSION = '2026.07.07'
+VUE_APP_VERSION = '2026.07.08'

File diff suppressed because it is too large
+ 79 - 595
package-lock.json


+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "eep_page",
-  "version": "2026.04.16",
+  "version": "2026.07.08",
   "private": true,
   "main": "main.js",
   "description": "智慧梧桐数字教材编辑器",
@@ -65,7 +65,7 @@
     "@vue/preload-webpack-plugin": "^2.0.0",
     "compression-webpack-plugin": "^6.1.2",
     "electron": "43.0.0",
-    "electron-builder": "^26.15.3",
+    "electron-builder": "^24.13.3",
     "eslint": "^8.57.1",
     "eslint-plugin-prettier": "^5.5.4",
     "eslint-plugin-vue": "^9.33.0",

+ 1 - 1
packages/package.json

@@ -1,6 +1,6 @@
 {
   "name": "eep-ui",
-  "version": "0.0.16",
+  "version": "0.0.17",
   "main": "eep/eep-ui.umd.js",
   "style": "eep/eep-ui.css",
   "exports": {

+ 1 - 4
src/components/PinyinText.vue

@@ -15,10 +15,7 @@
           v-if="block.type === 'text'"
           :key="'text-' + index"
           class="pinyin-sentence"
-          :style="[
-            { 'align-items': pinyinPosition === 'top' ? 'flex-end' : 'flex-start' },
-            block.sentenceStyle
-          ]"
+          :style="[{ 'align-items': pinyinPosition === 'top' ? 'flex-end' : 'flex-start' }, block.sentenceStyle]"
         >
           <span v-for="(word, wIndex) in block.word_list" :key="wIndex" class="pinyin-text" :style="block.styleObj">
             <span

+ 49 - 1
src/utils/http.js

@@ -9,6 +9,54 @@ const service = axios.create({
   timeout: 300000,
 });
 
+/**
+ * 获取请求错误信息
+ * @param {object} error 请求错误对象
+ * @returns {string} 返回错误提示信息
+ */
+function getRequestErrorMessage(error) {
+  const status = error.response?.status;
+  const code = error.code;
+
+  if (code === 'ECONNABORTED' || /timeout/i.test(error.message || '')) {
+    return '请求超时:服务器长时间未响应。下一步:请稍后重试,若持续出现请联系管理员检查服务状态。';
+  }
+
+  if (!error.response) {
+    if (typeof navigator !== 'undefined' && navigator.onLine === false) {
+      return '网络不可用:当前设备似乎已断网。下一步:请检查网络连接恢复后重新操作。';
+    }
+
+    if (code === 'ERR_NETWORK') {
+      return '网络异常:当前无法连接到服务器。下一步:请检查网络、服务地址或浏览器安全限制后重试。';
+    }
+
+    return `请求失败:${error.message || '无法连接服务器'}。下一步:请检查网络连接和服务地址后重试。`;
+  }
+
+  if (status === 401) {
+    return '登录状态已失效:当前请求未通过身份校验。下一步:请重新登录后再试。';
+  }
+
+  if (status === 403) {
+    return '没有操作权限:服务器拒绝了本次请求。下一步:请确认账号权限或联系管理员开通权限。';
+  }
+
+  if (status === 404) {
+    return '接口不存在:当前请求的服务或资源未找到。下一步:请确认请求地址或联系后端排查接口配置。';
+  }
+
+  if (status >= 500) {
+    return '服务异常:服务器处理请求时发生错误。下一步:请稍后重试,若持续出现请联系管理员查看服务日志。';
+  }
+
+  if (status >= 400) {
+    return `请求异常:服务器返回 ${status}。下一步:请核对提交内容后重试,必要时联系管理员排查。`;
+  }
+
+  return `请求失败:${error.message || '未知错误'}。下一步:请稍后重试。`;
+}
+
 // 请求拦截器
 service.interceptors.request.use(
   (config) => {
@@ -67,7 +115,7 @@ service.interceptors.response.use(
     }
 
     Message({
-      message: error.message,
+      message: getRequestErrorMessage(error),
       type: 'error',
       duration: 3 * 1000,
     });

+ 4 - 2
src/views/book/courseware/create/components/common/ResourcesOperate.vue

@@ -23,7 +23,9 @@
       <el-form ref="resourceForm" :model="resourceForm" :rules="resourceRules" label-width="60px">
         <el-form-item prop="position" label="位置">
           <el-radio-group v-model="resourceForm.position" size="medium">
-            <el-radio border v-for="node in node_list" :label="node.node_id">{{ node.node_name }}</el-radio>
+            <el-radio v-for="node in node_list" :key="node.node_id" border :label="node.node_id">
+              {{ node.node_name }}
+            </el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item prop="name" label="名称">
@@ -52,8 +54,8 @@ import { isEnable } from '@/views/book/courseware/data/common';
 
 export default {
   name: 'ResourcesOperate',
-  props: ['data'],
   inject: ['courseware_id', 'project_id', 'getProjectResourcePopedom'],
+  props: ['data'],
 
   data() {
     return {

+ 21 - 0
src/views/book/courseware/preview/components/common/PreviewMixin.js

@@ -325,6 +325,27 @@ const mixin = {
         content: JSON.stringify(content),
       });
     },
+
+    /**
+     * @description 从统一属性中获取样式
+     * @returns {Object} 样式对象
+     */
+    getBodyStyles() {
+      const styles = {};
+      const unifiedAttrib = this.data?.unified_attrib || {};
+
+      if (unifiedAttrib.font) {
+        styles['font-family'] = unifiedAttrib.font;
+      }
+      if (unifiedAttrib.font_size) {
+        styles['font-size'] = unifiedAttrib.font_size;
+      }
+      if (unifiedAttrib.text_color) {
+        styles['color'] = unifiedAttrib.text_color;
+      }
+
+      return styles;
+    },
   },
 };
 

+ 4 - 2
src/views/book/courseware/preview/components/judge/JudgePreview.vue

@@ -26,12 +26,13 @@
               :paragraph-list="paragraph_list"
               :rich-text-list="rich_text_list"
               :pinyin-position="data.property.pinyin_position"
+              :body-styles="getBodyStyles()"
               :is-preview="true"
             />
             <div
               v-else
               class="rich-text"
-              :style="{ fontSize: type === typeList[0] ? '12pt' : '' }"
+              :style="{ fontSize: type === typeList[0] ? '12pt' : '', ...getBodyStyles() }"
               v-html="convertText(sanitizeHTML(content))"
             ></div>
           </div>
@@ -98,12 +99,13 @@
               :paragraph-list="paragraph_list"
               :rich-text-list="rich_text_list"
               :pinyin-position="data.property.pinyin_position"
+              :body-styles="getBodyStyles()"
               :is-preview="true"
             />
             <div
               v-else
               class="rich-text"
-              :style="{ fontSize: type === typeList[0] ? '12pt' : '' }"
+              :style="{ fontSize: type === typeList[0] ? '12pt' : '', ...getBodyStyles() }"
               v-html="convertText(sanitizeHTML(content))"
             ></div>
           </div>

+ 7 - 1
src/views/book/courseware/preview/components/matching/MatchingPreview.vue

@@ -27,9 +27,15 @@
                 :paragraph-list="paragraph_list"
                 :rich-text-list="rich_text_list"
                 :pinyin-position="data.property.pinyin_position"
+                :body-styles="getBodyStyles()"
                 :is-preview="true"
               />
-              <span v-else class="content rich-text" v-html="convertText(sanitizeHTML(content))"></span>
+              <span
+                v-else
+                class="content rich-text"
+                :style="getBodyStyles()"
+                v-html="convertText(sanitizeHTML(content))"
+              ></span>
               <div v-if="showLang" class="lang">
                 {{ multilingual.find((item) => item.type === getLang())?.translation }}
               </div>

+ 4 - 2
src/views/book/courseware/preview/components/select/SelectPreview.vue

@@ -30,12 +30,13 @@
             :paragraph-list="paragraph_list"
             :rich-text-list="rich_text_list"
             :pinyin-position="data.property.pinyin_position"
+            :body-styles="getBodyStyles()"
             :is-preview="true"
           />
           <span
             v-else
             class="content rich-text"
-            :style="{ fontSize: type === typeList[0] ? '12pt' : '' }"
+            :style="{ fontSize: type === typeList[0] ? '12pt' : '', ...getBodyStyles() }"
             v-html="convertText(sanitizeHTML(content))"
           ></span>
           <div v-if="showLang" class="lang">
@@ -86,12 +87,13 @@
             :paragraph-list="paragraph_list"
             :rich-text-list="rich_text_list"
             :pinyin-position="data.property.pinyin_position"
+            :body-styles="getBodyStyles()"
             :is-preview="true"
           />
           <span
             v-else
             class="content rich-text"
-            :style="{ fontSize: type === typeList[0] ? '12pt' : '' }"
+            :style="{ fontSize: type === typeList[0] ? '12pt' : '', ...getBodyStyles() }"
             v-html="convertText(sanitizeHTML(content))"
           ></span>
           <div v-if="showLang" class="lang">

+ 7 - 1
src/views/book/courseware/preview/components/sort/SortPreview.vue

@@ -30,9 +30,15 @@
                 :paragraph-list="item.paragraph_list"
                 :rich-text-list="item.rich_text_list"
                 :pinyin-position="data.property.pinyin_position"
+                :body-styles="getBodyStyles()"
                 :is-preview="true"
               />
-              <span v-else class="rich-text" v-html="convertText(sanitizeHTML(item.content))"></span>
+              <span
+                v-else
+                class="rich-text"
+                :style="getBodyStyles()"
+                v-html="convertText(sanitizeHTML(item.content))"
+              ></span>
               <div v-if="showLang" class="lang">
                 {{ item.multilingual.find((item) => item.type === getLang())?.translation }}
               </div>

+ 1 - 1
src/views/create_project/createProject.vue

@@ -57,7 +57,7 @@
                   {{ tag }}
                 </el-tag>
               </div>
-              <el-input v-model="labelInput" placeholder="请输入标签" @keyup.enter.native="labelChange" />
+              <el-input v-model="labelInput" placeholder="请输入后点击回车" @keyup.enter.native="labelChange" />
             </div>
           </div>
           <div class="project-item">

+ 1 - 0
src/views/personal_workbench/project/ProductionEditorialManage.vue

@@ -734,6 +734,7 @@ export default {
 
   main {
     row-gap: 0;
+    min-width: 1800px;
     text-align: left;
 
     .chapters-container {

Some files were not shown because too many files changed in this diff