易学探索助手-个人记录(十二)

news2025/6/5 4:58:26

近期我完成了古籍处理板块页面升级,补充完成原文、句读、翻译的清空、保存和编辑(其中句读仅可修改标点)功能,新增原文和句读的繁简体切换功能

一、古籍处理板块整体页面升级

将原来一整个页面呈现的布局改为分栏呈现,更加清晰美观

组件结构概览

本页面主要由三部分组成:

  1. 侧边栏(<el-aside>

  2. 顶部导航栏(<el-header>

  3. 内容区域(<el-main>

  4. 折叠按钮(用于侧边栏展开/收起)

页面更新机制详解

侧边栏显示逻辑(v-if="showAside"

  • 使用 Vue 的 <transition name="aside-slide"> 实现侧边栏渐现/渐隐动画;

  • el-aside 中使用多个 catalog-item 模拟目录结构,子模块(如“翻译”)支持展开/收起。

<el-aside v-if="showAside" class="aside">

各菜单项的可点击状态通过 originalText?.trim() 等条件控制 disabled 类,防止未完成前置操作时点击。

折叠按钮逻辑(toggleAside)

  • 使用 :class="showAside ? 'from-aside' : 'from-left'" 控制其在侧边栏关闭或展开时的定位;

  • 点击按钮调用 toggleAside 切换 showAside 状态。

  • <div class="sider-toggle-button" :class="showAside ? 'from-aside' : 'from-left'" @click="toggleAside">
    

    按钮图标通过动态绑定 d 属性显示左/右箭头。

主内容更新逻辑(动态布局切换)

核心思想:通过 isSplitViewactiveTab 状态控制内容展示区域。

场景一:仅展示原文(初始状态)
<div v-if="!isSplitView" class="content-panel center-panel">
场景二:分栏展示(切换功能后)
<template v-if="isSplitView">
  <div class="content-panel left-panel"> <!-- 固定句读 -->
  <div class="content-panel right-panel"> <!-- 动态呈现翻译、知识图谱等 -->
  • 使用 <transition name="tab-flip" mode="out-in"> 为右侧内容切换添加翻页动画;

  • :key="activeTab" 确保 DOM 被销毁/重建,从而触发动画。

交互逻辑和状态控制

// 修改后的 handleClick 函数
function handleClick(tab) {
  if (tab === '原文' && !isSplitView.value) {
    activeTab.value = tab;
    return; // 初始原文居中
  }

  if (tab === '句读处理') {
    if (!originalText.value.trim()) {
      alert('请先输入或上传原文内容!');
      return;
    }
    activeTab.value = '原文'; // 右侧初始显示原文
    isSplitView.value = true; // 启动分栏布局

    if (segmentedText.value === '') {
      saveContent();
    }
    return;
  }

  if (['白话版翻译', '大众版翻译', '学术版翻译'].includes(tab)) {
    if (!originalText.value.trim() || !segmentedText.value.trim()) {
      alert('请先完成原文输入和句读处理!');
      return;
    }

    const version = tab.replace('翻译', '');
    translationVersion.value = version;
    activeTab.value = tab;
    isSplitView.value = true;

    if (translationResults.value[version]) {
      translationResult.value = translationResults.value[version];
      return;
    }

    showTranslation();
    generateKnowledgeGraph();
    return;
  }

  if (tab === '知识图谱') {
    //点进知识图谱页面
    if (!originalText.value.trim()) {
      alert('请先输入或上传原文内容!');
      return;
    }
    activeTab.value = tab;
    isSplitView.value = true;

    if (!translationResult.value?.trim()) {
      alert('请先进行翻译操作!');
      return;
    }

    generateKnowledgeGraph()

  } else {
    activeTab.value = tab;
    // 其他未指定的标签页也使用分栏布局
    isSplitView.value = true;
  }

  if (tab === '生成配图') {
    if (!originalText.value.trim() || !segmentedText.value.trim()) {
      alert('请先完成原文输入和句读处理!');
      return;
    }
    activeTab.value = tab;
    isSplitView.value = true;

    if (graph.value === '') {
      generateGraph();
    }
    return;
  }

  if (tab === '生成PPT') {
    if (!originalText.value.trim()) {
      alert('请先完成原文输入!');
      return;
    }
    activeTab.value = tab;
    router.push('/test');
    return;
  }

  // 默认行为
  activeTab.value = tab;
  isSplitView.value = true;
}

样式亮点分析(CSS)

1. 温润复古风配色与字体

  • 背景色使用米色、棕色渐变(#f9f4ec, #f3e9e4 等)

  • 字体采用 Noto Serif SC,凸显文雅古籍阅读氛围

2. 动画与过渡设计

  • aside-slide 控制侧边栏渐现/缩回宽度与透明度

  • tab-flip 采用 3D 视角切换内容,增强“翻书”体验

.dynamic-content-container {
  perspective: 1200px; /* 为翻转动画添加深度 */
}

3. 响应式布局控制

  • split-view 类名加上左右两栏固定宽度并设定 gap 间距;

  • 使用 v-if 分块渲染,确保初始加载性能更好。

效果展示

 二、古籍处理板块细节处理

补充完成原文、句读、翻译的清空、保存和编辑(其中句读仅可修改标点)功能

通过 handleClear() 分流调用对应清空函数:

const handleClear = () => {
  if (clearSource.value === 'original') {
    clearOriginalContent();
    clearGraph(); // 清图形
    clearAnnotation(); // 清标注
  } else if (clearSource.value === 'segmented') {
    clearSegmentedContent();
  } else if (clearSource.value === 'translation') {
    clearTranslationContent();
  }
};

保存,自动比对

原文自动清空翻译和句读结果,句读则自动清空翻译内容

if (originalText.value.trim() !== savedOriginalText.value.trim()) {
  segmentedText.value = '';
  translationResult.value = '';
  ...
}

逻辑说明

  • 避免重复提交。

  • 更新原文后,重置下游数据(句读 + 翻译)以防“脏数据”。句读类似

限制用户编辑句读内容时“只能修改标点”

watch(segmentedText, (newVal, oldVal) => {
  if (!isEditingSegmented.value || ignoreNextSegmentedChange.value) return;
  const chars = extractCharacters(newVal);
  if (chars !== originalCharacters.value) {
    segmentedText.value = lastValidSegmentedText;
    showWarningDialog.value = true;
  } else {
    lastValidSegmentedText = newVal;
  }
})
关键实现:
  • 通过 extractCharacters() 提取文本中非标点字符。

  • 利用 watch 监听 segmentedText 的变化:

    • 若用户插入或删除了非标点字符,即触发“还原 + 弹窗提示”。

 优点:
  • 提供 柔性保护机制,防止破坏句读处理结果的语义结构。

  • UI 体验更佳,及时告知用户限制范围。

新增原文和句读的繁简体切换功能

引入 opencc-js 模块

import * as OpenCC from 'opencc-js'

let s2t, t2s

onMounted(() => {
  s2t = OpenCC.Converter({ from: 'cn', to: 'tw' })
  t2s = OpenCC.Converter({ from: 'tw', to: 'cn' })
})
  • 使用 opencc-js 实现中文简繁转换。

  • 初始化两个转换器:

    • s2t:简体 ➝ 繁体

    • t2s:繁体 ➝ 简体

自动识别文本字符类型

const detectCharType = (text) => {
  if (!text.trim()) return 'simplified'
  const converted = OpenCC.Converter({ from: 'tw', to: 'cn' })(text)
  return converted === text ? 'simplified' : 'traditional'
}
  • 原理:若将文本“繁转简”后没有变化,说明原文是简体。

  • 简洁有效,用于首次渲染自动识别字符类型。

原文简繁切换

const toggleOriginalCharType = () => {
  if (!originalText.value.trim()) return

  if (charType.value === 'simplified') {
    originalText.value = s2t(originalText.value)
    charType.value = 'traditional'
  } else {
    originalText.value = t2s(originalText.value)
    charType.value = 'simplified'
  }
}
  • 支持双向切换。

  • charType 用于记录当前状态,避免冗余转换。

句读简繁切换 + watch 忽略机制

const toggleSegmentedCharType = () => {
  if (!segmentedText.value.trim()) return

  ignoreNextSegmentedChange.value = true  // 临时跳过编辑监听器

  if (segmentedCharType.value === 'simplified') {
    segmentedText.value = s2t(segmentedText.value)
    segmentedCharType.value = 'traditional'
  } else {
    segmentedText.value = t2s(segmentedText.value)
    segmentedCharType.value = 'simplified'
  }

  setTimeout(() => {
    ignoreNextSegmentedChange.value = false
  }, 0)
}
背景说明:

之前的代码中添加了“只能修改标点”的限制(通过 watch(segmentedText) 实现),若转换简繁文字,会被误判为“修改了文字”。

解决方案:
  • 设置标志 ignoreNextSegmentedChange = true 临时跳过监听器执行;

  • 利用 setTimeout(..., 0) 确保 DOM 更新后自动恢复监听逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python窗体编程技术详解

文章目录 1. Tkinter简介示例代码优势劣势 2. PyQt/PySide简介示例代码(PyQt5)优势劣势 3. wxPython简介示例代码优势劣势 4. Kivy简介示例代码优势劣势 5. PySimpleGUI简介示例代码优势劣势 技术对比总结选择建议 Python提供了多种实现图形用户界面(GUI)编程的技术&#xff0c…

NVMe协议简介之AXI总线更新

更新AXI4总线知识 AXI4总线协议 AXI4总线协议是由ARM公司提出的一种片内总线协议 &#xff0c;旨在实现SOC中各模块之间的高效可靠的数据传输和管理。AXI4协议具有高性能、高吞吐量和低延迟等优点&#xff0c;在SOC设计中被广泛应用 。随着时间的推移&#xff0c;AXI4的影响不…

设计模式——责任链设计模式(行为型)

摘要 责任链设计模式是一种行为型设计模式&#xff0c;旨在将请求的发送者与接收者解耦&#xff0c;通过多个处理器对象按链式结构依次处理请求&#xff0c;直到某个处理器处理为止。它包含抽象处理者、具体处理者和客户端等核心角色。该模式适用于多个对象可能处理请求的场景…

基于Android的医院陪诊预约系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

基于Spring Boot 电商书城平台系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

【金融基础学习】债券回购方式

债券回购作为货币市场的重要工具&#xff0c;本质上是一种以债券为抵押的短期资金借贷行为。在银行间市场&#xff0c;质押式回购与**买断式回购*是两种主要形式。 1. 质押式回购(Pledged Repo, RP) – 所有权不转移的短期融资工具 1.1 质押式回购概述 质押式回购是交易双方…

第五十九节:性能优化-GPU加速 (CUDA 模块)

在计算机视觉领域,实时性往往是关键瓶颈。当传统CPU处理高分辨率视频流或复杂算法时,力不从心。本文将深入探索OpenCV的CUDA模块,揭示如何通过GPU并行计算实现数量级的性能飞跃。 一、GPU加速:计算机视觉的必由之路 CPU的强项在于复杂逻辑和低延迟任务,但面对图像处理中高…

单元测试-概述入门

目录 main方法测试缺点&#xff1a; 在pom.xm中&#xff0c;引入junit的依赖。,在test/java目录下&#xff0c;创建测试类&#xff0c;并编写对应的测试方法&#xff0c;并在方法上声明test注解。 练习&#xff1a;验证身份证合法性 测试成功 测试失败 main方法测试缺点&am…

⚡ Hyperlane —— 比 Rocket 更快的 Rust Web 框架!

⚡ Hyperlane —— 比 Rocket 更快的 Rust Web 框架&#xff01; 在现代 Web 服务开发中&#xff0c;开发者需要一个既轻量级又高性能的 HTTP 服务器库来简化开发流程&#xff0c;同时确保服务的高效运行。Hyperlane 正是为此而生——一个专为 Rust 开发者设计的 HTTP 服务器库…

《AI Agent项目开发实战》DeepSeek R1模型蒸馏入门实战

一、模型蒸馏环境部署 注&#xff1a;本次实验仍然采用Ubuntu操作系统&#xff0c;基本配置如下&#xff1a; 需要注意的是&#xff0c;本次公开课以Qwen 1.5-instruct模型为例进行蒸馏&#xff0c;从而能省略冷启动SFT过程&#xff0c;并且 由于Qwen系列模型本身性能较强&…

字节golang后端二面

前端接口使用restful格式&#xff0c;post与get的区别是什么&#xff1f; HTTP网络返回的状态码有哪些&#xff1f; go语言切片与数组的区别是什么&#xff1f; MySQL实现并发安全避免两个事务同时对一个记录写操作的手段有哪些&#xff1f; 如何实现业务的幂等性&#xff08;在…

vscode + cmake + ninja+ gcc 搭建MCU开发环境

vscode cmake ninja gcc 搭建MCU开发环境 文章目录 vscode cmake ninja gcc 搭建MCU开发环境1. 前言2. 工具安装及介绍2.1 gcc2.1.1 gcc 介绍2.1.2 gcc 下载及安装 2.2 ninja2.2.1 ninja 介绍2.2 ninja 安装 2.3 cmake2.3.1 cmake 介绍2.3.2 cmake 安装 2.4 VScode 3. 上手…

三种经典算法优化无线传感器网络(WSN)覆盖(SSA-WSN、PSO-WSN、GWO-WSN),MATLAB代码实现

三种经典算法优化无线传感器网络(WSN)覆盖&#xff08;SSA-WSN、PSO-WSN、GWO-WSN&#xff09;&#xff0c;MATLAB代码实现 目录 三种经典算法优化无线传感器网络(WSN)覆盖&#xff08;SSA-WSN、PSO-WSN、GWO-WSN&#xff09;&#xff0c;MATLAB代码实现效果一览基本介绍程序设…

JVM 核心组件深度解析:堆、方法区、执行引擎与本地方法接口

一、JVM 堆内存&#xff1a;对象的生存与消亡之地 作为 Java 虚拟机中最大的内存区域&#xff0c;堆内存是所有对象实例的 “出生地” 与 “安息所”。从程序运行的角度看&#xff0c;所有通过new关键字创建的对象都在堆中分配内存&#xff0c;其生命周期完全由垃圾回收机制&am…

OpenCV4.4.0下载及初步配置(Win11)

目录 OpenCV4.4.0工具下载安装环境变量系统配置 OpenCV4.4.0 工具 系统&#xff1a;Windows 11 下载 OpenCV全版本百度网盘链接&#xff1a;: https://pan.baidu.com/s/15qTzucC6ela3bErdZ285oA?pwdjxuy 提取码: jxuy找到 opencv-4.0.0-vc14_vc15 下载得到 安装 运行op…

使用Mathematica观察多形式根的分布随参数的变化

有两种方式观察多项式的根随着参数变化&#xff1a;&#xff08;1&#xff09;直接制作一个小的动态视频&#xff1b;&#xff08;2&#xff09;绘制所有根形成的痕迹&#xff08;locus&#xff09;。 制作动态视频&#xff1a; (*Arg-plane plotting routine with plotting …

【C++高级主题】转换与多个基类

目录 一、多重继承的虚函数表结构&#xff1a;每个基类一个虚表 1.1 单继承与多重继承的虚表差异 1.2 代码示例&#xff1a;多重继承的虚函数覆盖 1.3 虚表结构示意图 二、指针与引用的类型转换&#xff1a;地址调整的底层逻辑 2.1 派生类指针转基类指针的地址偏移 2.2 …

『uniapp』添加桌面长按快捷操作 shortcuts(详细图文注释)

目录 手机环境适配说明安卓效果图代码 iOS(暂未实测,没有水果开发者)总结 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 手机环境适配说明 个别手机系统可能需要进行特别的权限设置,否则会无法使用 桌面快捷方式: 已知的有…

【LLM vs Agent】从语言模型到智能体,人工智能迈出的关键一步

目录 一、什么是 LLM&#xff1f;语言的天才&#xff0c;思维的起点 ✅ 特点小结&#xff1a; 二、什么是 Agent&#xff1f;智能的执行者&#xff0c;自主的决策者 ✅ 特点小结&#xff1a; 三、LLM 与 Agent 的关系&#xff1a;是工具&#xff0c;更是大脑 四、案例实战…

麦克风和电脑内播放声音实时识别转文字软件FunASR整合包V5下载

我基于FunASR制作的实时语音识别转文字软件当前更新到V5版本。软件可以实时识别麦克风声音和电脑内播放声音转为文字。 FunASR软件介绍 FunASR 是一款基础语音识别工具包和开源 SOTA 预训练模型&#xff0c;支持语音识别、语音活动检测、文本后处理等。 我使用FunASR制作了一…