当前位置: 首页 > news >正文

亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结

亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结


在这里插入图片描述

作为还没入门的业余编程爱好者,奋战了2天,借助AI开发一款FLASK小工具,功能还在完善中(时间轴可以跟随关联图缩放,加了一个用C键控制开关的十字光标),还有不少逻辑没有实现。通过实战,可以更好把握学习的方向,比如说开发同样一款功能的工具,可能有很多方法,要学会选择最优解;第二点,逻辑是编程的基本功,也就是说数学基础确实很重要咱是暂时业余爱好者,慢慢来,下面就把开发的经验过程的一点经验向大家分享一下咯。


一、引言

在创作小说的过程中,管理复杂的故事线是一项极具挑战性的任务。为了帮助作者更高效地组织和管理小说的情节、人物和时间线,我们计划开发一款基于Python Flask应用的可视化故事线管理工具。该工具将以直观的方式展示故事中的各个事件及其关联,同时提供丰富的功能来满足作者的需求。

二、功能需求梳理

(一)核心功能

  1. 节点管理:用节点表示事件,每个节点具备事件、时间、地点、人物、伏笔(起/止)、概要、内容等属性。支持新建节点,通过模板输入信息,并进行逻辑判断。
  2. 关联展示:用线条表示事件之间的关联,包括基于人物和时间的常规连线以及伏笔连线。
  3. 信息显示控制:通过选择框控制节点信息的显示方式,支持鼠标悬停显示和直接显示。

(二)界面功能

  1. 左侧功能区:提供界面明暗切换、格栅开关、新建节点、修改颜色和线型、显示选项设置、文件列表管理、伏笔提示列表展示、导入导出文件等功能。
  2. 右侧画板区:自适应框体,支持滑动和缩放操作,根据时间顺序展示节点和连线,并显示时间刻度。

(三)逻辑判断功能

对输入的事件信息进行逻辑判断,如判断时间、地点和人物的合理性,以及伏笔的起止顺序是否正确,并给出相应的错误提示。

三、技术栈和架构

(一)技术栈选择

  1. 后端:采用Python的Flask框架,它是一个轻量级的Web框架,易于上手和扩展,适合快速开发。
  2. 前端:使用HTML、CSS和JavaScript进行页面设计和交互实现。借助Flask的模板引擎,将后端数据动态渲染到前端页面。
  3. 数据存储:使用单个文件(如MD文本或CSV文本)存储节点信息,便于管理和维护。

(二)架构设计

  1. 分层架构:采用MVC(Model-View-Controller)架构,将应用分为模型层、视图层和控制层。

    • 模型层:负责处理数据的存储和逻辑判断,如读取和写入文件、判断事件信息的合理性等。
    • 视图层:负责展示用户界面,包括左侧功能区和右侧画板区,使用HTML和CSS进行页面布局和样式设计。
    • 控制层:负责处理用户请求和业务逻辑,如接收用户输入的节点信息、生成连线等,使用Flask实现路由和请求处理。
  2. 前后端交互:通过AJAX技术实现前后端的异步交互,提高用户体验。例如,在新建节点时,前端将用户输入的信息发送到后端进行逻辑判断,后端返回判断结果,前端根据结果进行相应的提示和更新。

四、安装依赖

(一)安装Python和Flask

确保你已经安装了Python 3.9及以上版本。可以使用以下命令安装Flask:

pip install flask

(二)配置开发环境

在VSCode中安装Python扩展,以便更好地进行代码编辑和调试。同时,配置PowerShell作为终端,方便执行命令。

五、详细开发步骤

(一)创建项目目录结构

storyline_manager/
│
├── app.py              # Flask应用主文件
├── templates/          # 存放HTML模板文件
│   ├── index.html      # 主页面模板
│   └── ...
├── static/             # 存放静态文件,如CSS、JavaScript和图片
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── script.js
│   └── ...
└── data/               # 存放数据文件,如MD或CSV文件└── storyline.md

(二)编写后端代码

  1. 创建Flask应用:在app.py中创建Flask应用实例,并定义路由和视图函数。
from flask import Flask, render_template, request, jsonifyapp = Flask(__name__)@app.route('/')
def index():return render_template('index.html')@app.route('/create_node', methods=['POST'])
def create_node():# 处理新建节点的逻辑data = request.get_json()# 进行逻辑判断# 保存节点信息到文件return jsonify({'status': 'success'})if __name__ == '__main__':app.run(debug=True)
  1. 实现数据存储和逻辑判断功能:在app.py中添加函数来读取和写入数据文件,并实现逻辑判断功能。
import osdef save_node_to_file(node):file_path = 'data/storyline.md'with open(file_path, 'a') as f:# 将节点信息写入文件f.write(f"{node['event']},{node['time']},{node['location']},{node['characters']},{node['foreshadowing']},{node['summary']},{node['content']}\n")def check_node_logic(node):# 进行逻辑判断,如时间、地点和人物的合理性,伏笔的起止顺序等# 返回判断结果和错误信息pass

(三)编写前端代码

  1. 设计HTML模板:在templates/index.html中设计主页面的HTML结构,包括左侧功能区和右侧画板区。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Storyline Manager</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body><div class="left-panel"><!-- 左侧功能区 --><button id="toggle-dark-mode">切换明暗</button><button id="toggle-grid">格栅开关</button><button id="create-node">新建节点</button><!-- 其他功能按钮和选项 --></div><div class="right-panel"><!-- 右侧画板区 --><div id="canvas"><!-- 节点和连线将在这里显示 --></div></div><script src="{{ url_for('static', filename='js/script.js') }}"></script>
</body>
</html>
  1. 实现前端交互功能:在static/js/script.js中编写JavaScript代码,实现用户交互功能,如点击按钮、输入信息、发送请求等。
document.getElementById('create-node').addEventListener('click', function() {// 弹出输入文本框const node = {event: prompt('请输入事件名称'),time: prompt('请输入事件时间'),location: prompt('请输入事件地点'),characters: prompt('请输入事件人物,用逗号分隔'),foreshadowing: prompt('请输入伏笔(起/止),可为空'),summary: prompt('请输入事件概要,可为空'),content: prompt('请输入事件内容,可为空')};// 发送请求到后端fetch('/create_node', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(node)}).then(response => response.json()).then(data => {if (data.status === 'success') {alert('节点创建成功');} else {alert(data.error);}});
});

(四)实现连线功能

  1. 后端逻辑:在app.py中添加函数来生成连线信息,根据人物和时间的关系判断节点之间的连线。
def generate_connections(nodes):connections = []# 根据人物和时间的关系生成连线return connections
  1. 前端展示:在static/js/script.js中根据后端返回的连线信息,在右侧画板区绘制连线。
function draw_connections(connections) {const canvas = document.getElementById('canvas');connections.forEach(connection => {const line = document.createElement('div');line.classList.add('connection-line');// 设置连线的位置和样式canvas.appendChild(line);});
}

(五)实现时间刻度功能

  1. 后端处理:在app.py中添加函数来生成时间刻度信息,根据节点的时间范围确定刻度的范围和间隔。
def generate_time_scale(nodes):time_scale = []# 根据节点的时间范围生成时间刻度return time_scale
  1. 前端展示:在static/js/script.js中根据后端返回的时间刻度信息,在右侧画板区绘制时间刻度,并实现鼠标悬停显示功能。
function draw_time_scale(time_scale) {const canvas = document.getElementById('canvas');time_scale.forEach(scale => {const line = document.createElement('div');line.classList.add('time-scale-line');// 设置时间刻度的位置和样式canvas.appendChild(line);});// 实现鼠标悬停显示功能document.querySelectorAll('.time-scale-line').forEach(line => {line.addEventListener('mouseenter', function() {// 显示刻度年份});line.addEventListener('mouseleave', function() {// 隐藏刻度年份});});
}

六、调试和本地化部署

(一)调试

在开发过程中,可以使用Flask的调试模式来方便地进行调试。在app.py中启动应用时,将debug参数设置为True

if __name__ == '__main__':app.run(debug=True)

这样,当代码发生变化时,Flask会自动重新加载应用,并且在出现错误时会在浏览器中显示详细的错误信息。

(二)本地化部署

将开发好的应用部署到本地服务器上,可以使用以下步骤:

  1. 确保已经安装了Python和Flask。
  2. 在项目根目录下,打开PowerShell窗口,运行以下命令启动应用:
python app.py
  1. 打开浏览器,访问http://127.0.0.1:5000,即可看到应用的主页面。

七、测试

(一)功能测试

对应用的各个功能进行测试,包括新建节点、修改颜色和线型、显示选项设置、导入导出文件等,确保功能正常运行。

(二)逻辑测试

对应用的逻辑判断功能进行测试,输入不同的事件信息,检查是否能正确判断时间、地点和人物的合理性,以及伏笔的起止顺序是否正确,并给出相应的错误提示。

(三)界面测试

对应用的界面进行测试,检查界面的布局和样式是否美观,是否支持自适应和缩放操作,以及鼠标悬停和点击事件是否正常响应。

八、困难点及经验介绍

在利用AI辅助开发这款工具的过程中,遇到了不少挑战,也积累了一些实用经验。

定期备份代码至关重要:开发中常因架构文件分散、代码量大,加上AI上下文联系能力有限,容易卡在逻辑或细节问题上,若忘记备份,可能导致大量工作白费。因此,经常备份可避免因突发问题(如逻辑错误导致代码无法运行、AI生成代码失误难以回溯等)造成进度倒退。

开发前的整体构思不可或缺:需先规划好界面布局、功能分类,例如将鼠标事件相关逻辑集中在一段时间开发。若在复杂逻辑中临时插入新功能,极易引发冲突,导致原有功能异常。比如在已有节点显示逻辑中突然加入新的鼠标悬停效果,可能因事件监听冲突或样式干扰,使整个界面交互混乱。

采用“小步快跑”的开发策略:每次仅增加1-2个功能,完成后立即测试对之前功能的影响。例如先实现节点新建与基本逻辑判断,测试无误后,再添加连线功能,避免一次性堆积过多功能导致问题排查困难。AI生成代码虽高效,但一次性处理复杂需求易出错,拆分功能点逐步实现,能降低风险。

合理搭配AI工具:如deepseek逻辑性强,但存在繁忙限制,可将其用于核心逻辑代码生成;小问题或简单代码检查修改,可借助豆包或VSCode的Copilot。当deepseek生成代码后找不到插入位置时,可让Copilot辅助插入,并明确要求不修改其他功能。例如在整合前端界面与后端数据传输代码时,deepseek负责核心逻辑,Copilot处理代码插入细节,提升开发效率。

九、未来拓展

(一)增加更多功能

  1. 支持节点的编辑和删除功能,方便用户对已有的事件进行修改和管理。
  2. 提供更多的可视化效果,如节点的动画效果、连线的颜色和样式定制等,增强用户体验。
  3. 支持多人协作功能,允许多个用户同时编辑和管理同一个故事线。

(二)优化性能

随着故事线的复杂度增加,应用的性能可能会受到影响。可以对代码进行优化,如采用缓存机制、优化数据存储和查询方式等,提高应用的响应速度和处理能力。

(三)集成第三方工具

可以将该工具与其他写作工具(如Markdown编辑器、思维导图工具等)进行集成,方便用户在不同的工具之间切换和协作。

十、总结

通过以上步骤,我们可以利用Python的Flask框架开发一个可视化故事线管理工具。该工具将帮助作者更高效地组织和管理小说的情节、人物和时间线,提高写作效率和质量。在开发过程中,我们需要仔细梳理功能需求,选择合适的技术栈和架构,按照详细的开发步骤进行编码和调试,并进行充分的测试和优化。同时,我们还可以考虑未来的拓展方向,不断完善和提升工具的功能和性能。利用AI辅助开发不仅能亲身体验编程魅力,还能在实操中锻炼能力,比单纯看书或看教学视频更有趣、更具成效。

相关文章:

亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结

亲手打造可视化故事线管理工具&#xff1a;开发全流程、难点突破与开发过程经验总结 作为还没入门的业余编程爱好者&#xff0c;奋战了2天&#xff0c;借助AI开发一款FLASK小工具&#xff0c;功能还在完善中&#xff08;时间轴可以跟随关联图缩放&#xff0c;加了一个用C键控制…...

CSS 字体学习笔记

在网页设计中&#xff0c;字体的使用对于提升用户体验和页面美观性至关重要。CSS 提供了一系列字体属性&#xff0c;用于控制文本的显示效果。以下是对 CSS 字体属性的详细学习笔记。 一、字体系列&#xff08;font-family&#xff09; 1. 字体系列的分类 在 CSS 中&#xf…...

通过 spring ai 对接 deepseek ai 大模型通过向量数据库,完成 AI 写标书及构建知识库功能的设计与开发

AI写标书及知识库构建详细设计方案 一、系统架构设计 +-------------------+ +-------------------+ +-------------------+ | 用户交互层 | | AI服务层 | | 知识库存储层 | | (Web/API) |---->| (Spring AI) |---…...

cropperjs 2.0裁剪图片后转base64提示“Tainted canvases may not be exported”跨域问题的解决办法。

目录 为什么会有这边文章 辛酸历程&#xff0c;不看也罢 想解决问题&#xff0c;看这里就够了 问题已解决&#xff0c;后边还是废话 为什么会有这边文章 最近&#xff0c;做一个项目需要用在前端实现图片裁剪功能&#xff0c;毋庸置疑&#xff0c;cropperjs是不二选择。当在…...

2、JSX:魔法世界的通行证——用魔法符号编织动态界面

一、开篇&#xff1a;魔法符号的觉醒 "看呐&#xff0c;赫敏&#xff01;这根魔杖&#xff08;React组件&#xff09;为何能自动绘制出动态界面&#xff1f;"年轻的巫师学徒罗恩指着闪烁的屏幕惊呼。 "这就是JSX魔法阵的威力&#xff0c;"邓布利多校长挥舞…...

八大排序算法

目录 八大排序算法排序算法的稳定性比较排序插入排序直接插入排序希尔排序希尔排序的时间复杂度计算 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序递归hoare版本挖坑法lomuto前后指针 非递归 归并排序排序性能对比 非比较排序计数排序 比较排序算法总结 八大排序算法 …...

搭建一个Spring Boot聚合项目

1. 创建父项目 打开IntelliJ IDEA&#xff0c;选择 New Project。 在创建向导中选择 Maven&#xff0c;确保选中 Create from archetype&#xff0c;选择 org.apache.maven.archetypes:maven-archetype-quickstart。 填写项目信息&#xff1a; GroupId&#xff1a;com.exampl…...

Google A2A协议解析:构建分布式异构多Agent系统

一、A2A 是什么&#xff1f;有什么用&#xff1f; 1.1 A2A 是什么&#xff1f; A2A&#xff08;Agent-to-Agent Protocol&#xff09;是Google最新推出的一项开源协议&#xff0c;旨在为AI智能体&#xff08;Agents&#xff09;提供标准化的通信方式。它允许不同框架&#xf…...

【Android读书笔记】读书笔记记录

文章目录 一. Android开发艺术探索1. Activity的生命周期和启动模式1.1 生命周期全面分析 一. Android开发艺术探索 1. Activity的生命周期和启动模式 1.1 生命周期全面分析 onPause和onStop onPause后会快速调用onStop&#xff0c;极端条件下直接调用onResume 当用户打开新…...

支持selenium的chrome driver更新到135.0.7049.84

最近chrome释放新版本&#xff1a;135.0.7049.84 如果运行selenium自动化测试出现以下问题&#xff0c;是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...

【玩泰山派】MISC(杂项)- 使用vscode远程连接泰山派进行开发

文章目录 前言流程1、安装、启动sshd2、配置一下允许root登录3、vscode中配置1、安装remote插件2、登录 **注意** 前言 有时候要在开发板中写一写代码&#xff0c;直接在终端中使用vim这种工具有时候也不是很方便。这里准备使用vscode去通过ssh远程连接泰山派去操作&#xff0…...

利用阿里云企业邮箱服务实现Python群发邮件

目录 一、阿里云企业邮箱群发邮件全流程实现 1. 准备工作与环境配置 2. 收件人列表管理 3. 邮件内容构建 4. 附件添加实现 5. 邮件发送核心逻辑 二、开发过程中遇到的问题与解决方案 1. 附件发送失败问题 2. 中文文件名乱码问题 3. 企业邮箱认证失败 三、完整工作流…...

中文编码,GB系列,UTF

图片来源&#xff1a;https://zhuanlan.zhihu.com/p/701690894 文章目录 ASCIIGB系列编码UTF编码 ASCII American Standard Code for Information Interchange 一个字节&#xff0c;但其实只用了一半&#xff1a; 128个字符 GB系列编码 “国标” 和ASCII是兼容的。 GB2312…...

车载以太网-TLS

文章目录 车载以太网与TLS的技术背景核心定位车载以太网TLS的技术架构车载TLS的核心安全机制TLS报文结构详解TLS工作机制密钥交换与计算流程标题完整握手流程(1-RTT)数据传输加密流程车载TLS的独特优化策略车载TLS的安全威胁相关标准车载以太网TLS(Transport Layer Security…...

【大英赛】大英赛准备笔记

听力 总结 提醒专注 一题一个听力时&#xff0c;听是重点 抓紧时间往后审题 比较容易的部分&#xff1a;secA & secD中的dictation&#xff0c;在大致审当前的基础上&#xff0c;分别利用这个时间提前看后面的secB√& summery secA 听之前应当大致审选项&#x…...

有序数组的平方

暴力排序 每个数平方以后排个序 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int slow0,fast0;int nnums.size();while(fast<n){nums[slow]nums[fast]*nums[fast];fast;slow;}sort(nums.begin(),nums.end());return nums;} }…...

Python基于Django的房屋信息可视化及价格预测系统(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…...

【5G-A学习】ISAC通信感知一体化学习小记

通信感知一体化&#xff08;Integrated Sensing and Communication, ISAC&#xff09;是一种将无线通信与环境感知功能深度融合的技术&#xff0c;通过共享硬件、频谱和信号处理流程&#xff0c;实现通信与感知的协同增效。其核心原理及无人机与飞鸟的识别方式如下&#xff1a;…...

深入解析@Validated注解:Spring 验证机制的核心工具

一、注解出处与核心定位 1. 注解来源 • 所属框架&#xff1a;Validated 是 Spring Framework 提供的注解&#xff08;org.springframework.validation.annotation 包下&#xff09;。 • 核心定位&#xff1a; 作为 Spring 对 JSR-380&#xff08;Bean Validation 2.0&#…...

学生考勤管理系统(jsp+ssh+mysql5.x)含文档

学生考勤管理系统&#xff08;jspsshmysql5.x&#xff09;含万字详细文档 学生考勤管理系统是一个用于管理学生出勤和请假的系统&#xff0c;系统登录页面提供账号和密码输入框&#xff0c;用户可以选择角色进行登录。系统主菜单包括班级管理、用户管理、课程表管理和考勤情况…...

【响应式编程】Reactor 常用操作符与使用指南

文章目录 一、创建操作符1. just —— 创建包含指定元素的流2. fromIterable —— 从集合创建 Flux3. empty —— 创建空的 Flux 或 Mono4. fromArray —— 从数组创建 Flux5. fromStream —— 从 Java 8 Stream 创建 Flux6. create —— 使用 FluxSink 手动发射元素7. generat…...

为什么我们需要if __name__ == __main__:

[目录] 0.前言 1.什么是 __name__&#xff1f; 2.if __name__ __main__: 的作用 3.为何Windows更需if __name__ &#xff1f;前言 if __name__ __main__: 是 Python 中一个非常重要的惯用法&#xff0c;尤其在使用 multiprocessing 模块或编写可导入的模块时。它的作用是区分…...

Week 1: Time Complexity, Rectangle Geometry

问题集 Square PastureBucket BrigadeBlocked BillboardBlocked Billboard IIWord ProcessorDo You Know Your ABCs?The Cow-SignalD3C - White Sheet 视频解析 Square Pasture Bucket Brigade Blocked Billboard Blocked Billboard II Word Processor Do You Know Your AB…...

论文学习:《通过基于元学习的图变换探索冷启动场景下的药物-靶标相互作用预测》

原文标题&#xff1a;Exploring drug-target interaction prediction on cold-start scenarios via meta-learning-based graph transformer 原文链接&#xff1a;https://www.sciencedirect.com/science/article/pii/S1046202324002470 药物-靶点相互作用&#xff08;DTI&…...

STM32 HAL库 OLED驱动实现

一、概述 1.1 OLED 显示屏简介 OLED&#xff08;Organic Light - Emitting Diode&#xff09;即有机发光二极管&#xff0c;与传统的 LCD 显示屏相比&#xff0c;OLED 具有自发光、视角广、响应速度快、对比度高、功耗低等优点。在嵌入式系统中&#xff0c;OLED 显示屏常被用…...

UE5蓝图之间的通信------接口

一、创建蓝图接口 二、双击创建的蓝图接口&#xff0c;添加函数&#xff0c;并重命名新函数。 三、在一个蓝图&#xff08;如玩家角色蓝图&#xff09;中实现接口&#xff0c;如下图&#xff1a; 步骤一&#xff1a;点击类设置 步骤二&#xff1a;在细节面板已经实现的接口中…...

封装Tcp Socket

封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及&#xff0c;这里就不再粘贴源码了&#xff0c;学习地址如下&#xff1a;https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…...

深入解析 Android 图形系统:Canvas、Skia、OpenGL 与 SurfaceFlinger 的协作

在 Android 应用开发中&#xff0c;流畅的 UI 渲染是用户体验的核心。但你是否好奇&#xff0c;一个简单的 View 是如何从代码中的 onDraw() 方法一步步变成屏幕上的像素的&#xff1f;本文将从底层图形系统的视角&#xff0c;解析 Android 中 Canvas、Skia、OpenGL ES 和 Surf…...

LeetCode每日一题4.13

1922. 统计好数字的数目 问题 问题分析 题目要求我们找到长度为 n 且满足特定条件&#xff08;偶数下标处为偶数&#xff0c;奇数下标处为质数&#xff09;的数字字符串的总数&#xff0c;并对 (10^9 7) 取余。 思路 1.枚举 生成所有可能的数字字符串&#xff1a;对于长度…...

Java学习——day29(并发控制高级工具与设计模式)

文章目录 1. 并发控制高级工具简介1.1 CountDownLatch1.2 CyclicBarrier1.3 Semaphore1.4 并发设计模式 2. 扩展生产者—消费者示例2.1 示例代码 3. 代码详解3.1 主类 ExtendedProducerConsumerDemo3.2 Buffer 类3.3 Producer 类3.4 Consumer 类 4. 编译与运行结果4.1 编译4.2 …...

使用FormData格式上传图片

为什么要使用FormData格式上传图片 1. 为什么使用 FormData&#xff1f; FormData 是一种专门用于构建表单数据的对象&#xff0c;它能够以 multipart/form-data 格式发送数据&#xff0c;这是文件上传的标准格式。以下是使用 FormData 的主要原因&#xff1a; 简单易用 直…...

Tkinter表格与列表框应用

在图形用户界面(GUI)开发中,表格和列表框是常用的控件,用于显示和管理大量的数据。Tkinter提供了Listbox控件来显示简单的列表数据,而对于更复杂的表格数据,可以使用Treeview控件(属于ttk模块)来实现。这一章将介绍如何使用Listbox和Treeview来显示和操作数据,帮助您处…...

【Excel】数据透视表月度数据排序不正确

【问题】 插入数据透视表后&#xff0c;月度列显示的日期&#xff0c;是按照文本格式排序的&#xff0c;显然与实际月份排序并不相符。 【目的】 按照从1月份到12月份进行自然月度排序。 【方法】 步骤一&#xff1a; 在任意一处&#xff0c;输入“1月”-“12月”&#…...

HCIP第十天

OSPF的数据包 OSPF是跨层封装协议,直接封装在网络层之上 --- 需要IP协议使用一个协议号来标定 OSPF --- 89 OSPF的头部 版本 --- OSPF的版本 --- 2 类型 --- OSPF数据包的类型 --- hello -- 1 DBD -- 2 LSR -- 3 LSU -- 4 LSACK -- 5 路由器ID --- RID --- 携带的是发出O…...

Vue2,Vue3知识大全

Vue 1.了解vue,快速上手 vue是一个用于构建用户的界面的渐进式框架. vue的两种使用方法: vue核心包开发 场景:局部模块改造 vue核心包&vue插件 工程化开发 场景:整站开发 1.创建一个vue实例: 2.插值表达式 1.插值表达式是一种Vue的模版语法 作用:利用表达式进行插值…...

java面向对象02:回顾方法

回顾方法及加深 定义方法 修饰符 返回类型 break&#xff1a;跳出switch和return的区别 方法名 参数列表 package com.oop.demo01;//Demo01类 public class Demo01 {//main方法public static void main(String[] args) {}/*修饰符 返回值类型 方法名(...){//方法体return…...

【Ubuntu】【树莓派】Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问和文件传输操作

目录 一、Ubuntu远程终端并实现文件上传下载 1.1Ubuntu桥接模式设置和新用户的创建 1.2Ubuntu的远程登录并上传和下载文件 1.3在Xming中进行Ubuntu的图形访问 二、树莓派远程登录并实现文件上传下载 2.1树莓派在putty上的远程登录 2.2使用ftp远程登录并实现文件上传下载…...

Linux Kernel 2

地址空间&#xff08;Address Space&#xff09; 一、物理地址空间&#xff08;Physical Address Space&#xff09; 物理地址空间 是指 RAM 和设备内存 在系统内存总线上所呈现的地址布局。 举例&#xff1a;在典型的 32 32 32 位 Intel 架构中&#xff0c; RAM&#xff08…...

二.springBoot项目集成ElasticSearch及使用

二.springBoot项目集成ElasticSearch及使用 1.依赖引入2.ElasticSearch常见用法 1.依赖引入 <!--elasticsearch搜索引擎--> <!--高版本7.0后TransportClient已被淘汰&#xff0c;用rest-high-level-client代替--> <dependency><groupId>org.elasticse…...

从三次方程到复平面:复数概念的奇妙演进(一)

注&#xff1a;本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载&#xff0c;此为第一篇。 生料&#xff0c;不同的文章不同的点。 机翻&#xff0c;未校。 Reflections on the History of Complex Numbers 复数的历史回顾 The first occurrence o…...

Day52 | 6. Z 字形变换、8. 字符串转换整数 (atoi)、22. 括号生成、38. 外观数列

6. Z 字形变换 题目链接&#xff1a;6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 题目难度&#xff1a;中等 代码&#xff1a; class Solution {public String convert(String s, int numRows) {if(numRows<2) return s;List<StringBuilder> rowsnew A…...

每日OJ_牛客_ruby和薯条_排序+二分/滑动窗口_C++_Java

目录 ruby和薯条_排序二分/滑动窗口 题目解析 C代码 Java代码 ruby和薯条_排序二分/滑动窗口 ruby和薯条 描述&#xff1a; ruby很喜欢吃薯条。 有一天&#xff0c;她拿出了n根薯条。第i根薯条的长度为ai。 ruby认为&#xff0c;若两根薯条的长度之差在l和r之间&#xff…...

快速幂运算

快速幂运算 一、快速幂运算快速幂运算&#xff08;Exponentiation by Squaring&#xff09;基本思想算法实现&#xff08;②③为非递归&#xff09;① 递归运算② 普通 除模运算&#xff08;不带 **模数** 与 带 **模数**&#xff09;③ 按位与运算 使用示例示例代码 复杂度分析…...

vue @import引入CSS scoped无效 造成全局样式污染

引入css文件导致全局样式污染 1.写在单组件的style里面css样式&#xff0c;如果标签内不加scoped可能会影响其他组件的样式 <style lang"scss" scoped> </style> 2.通过import引入的外部css文件&#xff0c;这种引入方式是全局的&#xff0c;也会影响其…...

基于Flask-Login简单登录和权限控制实践

1. 关于Flask-Login Flask-Login 是一个为python Flask Web框架设计的扩展,用于管理用户会话(用户登录状态)。它提供了简单的接口来处理用户登录、注销、记住用户等功能,同时确保用户会话的安全性。以下是 Flask-Login 的一些关键特性和功能: 1.1. 主要功能 用户会话管理…...

文件流---------获取文件的内容到控制台

总流程&#xff1a;先创建一个文本文件------->里面写入一些内容&#xff08;纯字母和字母加文字&#xff09;-----------> 然后通过输入流获取文件里面的内容&#xff0c;两种方式。 1.第一种&#xff0c;获取单个的字符 &#xff0c;先创建文件 &#xff0c;java.txt…...

idea 2024 build菜单不见了

Q如题 idea 2024 新版UI添加build和recompile菜单 A如图&#xff0c;右键顶部栏之后&#xff0c;点击Add to Main Toolbar菜单&#xff0c;在里面就能找到Build菜单&#xff0c;添加接口。 Recompile菜单的话在Customize Toolbar中搜索添加才行。...

深入理解计算机操作系统(持续更新中...)

文章目录 一、计算机系统漫游1.1信息就是位上下文 一、计算机系统漫游 1.1信息就是位上下文 源程序实际上就是一个由值0和1组成的位&#xff08;又称为比特&#xff09;&#xff0c;八个位被组织成一组&#xff0c;称为字节。每个字节表示程序中的某些文本字符 大部分现代计…...

[dp8_子数组] 乘积为正数的最长子数组长度 | 等差数列划分 | 最长湍流子数组

目录 1.乘积为正数的最长子数组长度 2.等差数列划分 3.最长湍流子数组 写代码做到&#xff0c;只用维护好自己的一小步 1.乘积为正数的最长子数组长度 链接&#xff1a;1567. 乘积为正数的最长子数组长度 给你一个整数数组 nums &#xff0c;请你求出乘积为正数的最长子数…...

量子机器学习(Quantum Machine Learning, QML)在优化测试组合

量子机器学习(Quantum Machine Learning, QML)在优化测试组合选择中展现出显著潜力,通过量子计算的并行性和量子态叠加特性,可高效解决传统方法难以处理的组合爆炸问题。以下是其技术实现路径、优势及落地案例: 一、QML优化测试组合的核心原理 1. 量子并行性加速搜索 经典…...