StarUML6.0.1使用
1. 简介
作为一个软件开发人员,平时免不了做一定的软件设计,标准做法就是采用UML来设计:
- 讨论功能流程时采用时序图、活动图来表达;
- 做业务功能架构时采用组件图来表达;
- 做系统部署架构时采用部署图来表达;
- 做需求分析时采用用例图来表达;
- 做系统内部设计时采用包图、类图、对象图来表达;
二十年前我们用Rational Rose,过了五六年感觉PowerDesign更好,之后十多年一直钟爱PD,直到上个月用了7年的笔记本坏了,新笔记本重装环境时,再也不想去破解PowerDesign,而是寻找一个开源的UML工具软件来用用看,一通baidu之后发现了StarUML,是由思密达主导开发的一款开源UML工具软件,看看官网的图片介绍还是不错的。
官网地址:StarUML
开源地址:https://github.com/staruml ,这里有很多工程。一般我们直接去官网下载已经制作好的安装包即可,安装都很简单。
2. 破解
直接采用官网制作好的安装包,在每次保存时总是提示去注册,让人很烦;把UML设计图导出png, jpeg图片时,更是留下了unregisted之类的水印,根本没法在文档里使用。我们需要解决两个问题:
- 去掉注册提示框;
- 去掉图片上的水印。
解决这两个问题很简单,去StarUML安装目录下寻找app.asar文件,修改这个包里的两处地方即可。
app.asar是一个压缩包,需要用asar来生成和解压,asar用npm来安装:
npm install -g asar
npm自然是安装nodejs就有了,搞点前端的人都不用说了。
执行asar看看:
$ asar -h
Usage: asar [options] [command]Manipulate asar archive files
Options:
-V, --version output the version number
-h, --help display help for commandCommands:
pack|p [options] <dir> <output> create asar archive
list|l [options] <archive> list files of asar archive
extract-file|ef <archive> <filename> extract one file from archive
extract|e <archive> <dest> extract archive
*
help [command] display help for command
2.1 解包app.asar
我们进入StarUML安装目录,找到app.asar文件,如我的安装目录C:\Program Files\StarUML\resources下有如下文件:
app.asar app-update.yml elevate.exe* mdj.ico
解压app.asar:
asar extract app.asar app
得到app目录, 进入目录app\src\engine:
C:\Program Files\StarUML\resources\app\src\engine
$ ls
clipboard-manager.js default-commands.js engine.js font-manager.js pdf-graphics.js selection-manager.js update-manager.js
command-manager.js diagram-export.js factory.js license-manager.js project-manager.js unicode.js
最关键的是两个文件:license-manager.js和diagram-export.js,看看英文都知道,一个管注册license,一个管图片导出。
2.2 去掉注册提示
打开license-manager.js,找到如下代码:
checkLicenseValidity() { if (packageJSON.config.setappBuild) { setStatus(this, true); } else { this.validate().then( () => { setStatus(this, true); }, () => { setStatus(this, false); UnregisteredDialog.showDialog(); }, ); } }
修改为:
checkLicenseValidity() { if (packageJSON.config.setappBuild) { setStatus(this, true); } else { this.validate().then( () => { setStatus(this, true); }, () => { //setStatus(this, false); //UnregisteredDialog.showDialog(); setStatus(this, true); }, ); } }
那么我们的注册提示就去掉了。
2.3 去掉图片水印
打开diagram-export.js,找到如下代码:
// Draw watermark if application is not registeredif (app.licenseManager.getStatus() !== true) {diagram.drawWatermark(canvas,canvasElement.width,canvasElement.height,70,12,"UNREGISTERED",);} else if (app.licenseManager.getLicenseInfo().licenseType === "STD") {const dgmType = diagram.constructor.name;if (app.licenseManager.isProDiagram(dgmType)) {diagram.drawWatermark(canvas,canvasElement.width,canvasElement.height,45,12,"PRO ONLY",);}}// Draw diagram to the new canvasdiagram.arrangeDiagram(canvas);diagram.drawDiagram(canvas);// Return the new canvas to base64-encoded datavar data = canvasElement.toDataURL(type).replace(/^data:image\/(png|jpeg);base64,/, "");return data;
}
修改为:
// Draw watermark if application is not registered/*if (app.licenseManager.getStatus() !== true) {diagram.drawWatermark(canvas,canvasElement.width,canvasElement.height,70,12,"UNREGISTERED",);} else if (app.licenseManager.getLicenseInfo().licenseType === "STD") {const dgmType = diagram.constructor.name;if (app.licenseManager.isProDiagram(dgmType)) {diagram.drawWatermark(canvas,canvasElement.width,canvasElement.height,45,12,"PRO ONLY",);}}*/// Draw diagram to the new canvasdiagram.arrangeDiagram(canvas);diagram.drawDiagram(canvas);// Return the new canvas to base64-encoded datavar data = canvasElement.toDataURL(type).replace(/^data:image\/(png|jpeg);base64,/, "");return data;
}
就是把两个处理水印的代码注释掉即可。
2.4 打包app.asar
在安装目录C:\Program Files\StarUML\resources下执行:
asar pack app app.asar
新的app.asar已经生成成功,则我们重新去打开StarUML,以上两个问题都完美解决了。
3. 总结
StarUML6.0.1还是很好使用的,很小巧,建议使用UML做架构设计的同仁来试试,看到很多年轻开发人员做设计时随意用word里的图形功能来设计,或者其它脑图来设计,我还是推荐采用UML来做软件设计,毕竟是一个很成熟的标准,何必放着标准不用而去用其它呢。
相关文章:
StarUML6.0.1使用
1. 简介 作为一个软件开发人员,平时免不了做一定的软件设计,标准做法就是采用UML来设计: 讨论功能流程时采用时序图、活动图来表达;做业务功能架构时采用组件图来表达;做系统部署架构时采用部署图来表达;做…...
Java开发与配置用到的各类中间件官网
开发配置时用到了一些官网地址,记录一下。 activemq 官网:ActiveMQ elk 官网:Elasticsearch 平台 — 大规模查找实时答案 | Elastic nginx 官网:nginx maven 官网:Maven – Welcome to Apache Maven nexus 官网&a…...
GitHub和Gitee的基本使用和在IDEA中的集成
文章目录 【1】GitHub1.创建仓库2.增加和修改文件3.创建分支4.删除仓库5.远程仓库下载到本地 【2】Gitee1.创建仓库2.远程仓库下载到本地. 【3】IDEA集成GitHub【4】IDEA集成Gitee1.在Gitee中修改,同步到本地2.从Gitee中下载项目 【1】GitHub 1.创建仓库 先登陆这…...
[Electron]中screen屏幕
Electron中screen 检索有关屏幕大小、显示器、光标位置等的信息。可以实现以下两个功能 窗口全屏 显示在额外显示器上 方法 screen.getCursorScreenPoint() 返回 Point当前鼠标的绝对位置。 screen.getPrimaryDisplay() 返回主窗口Display screen.getAllDisplays() 返…...
ubuntu 卸载miniconda3
一开始安装路径错了,需要重新安一次,就一起记录了。 前提是这种方式安装: ubuntu安装miniconda3管理python版本-CSDN博客 删除Miniconda的安装目录 这目录就是你选择安装的时候指定的,如果记不得了,可以这样查看 which conda 这…...
光致发光谱荧光量子效率测量系统
荧光量子积分球是一个专门用于测量荧光量子效率的设备。荧光量子效率是指物质吸收光后所发射的荧光光子数与所吸收的激发光光子数之间的比值。这种设备通过比较待测荧光物质和已知荧光量子产率的参比物质,在相同激发条件下所测得的积分荧光强度(即校正的…...
c++ 常用的STL
前言 写这篇博客目的是为了记录在刷算法题中使用过的STL,因为有些不太常用的会遗忘。这篇博客只是作为笔记,不是详细的STL,因此只会对常用方法说明,不会详细介绍。此外在后面用到新的STL内容时会再补充。 列队 基础列队 基本列…...
接口自动化测试思路和实战 —— 编写线性测试脚本实战!
接口自动化测试框架目的 测试工程师应用自动化测试框架的目的: 增强测试脚本的可维护性、易用性(降低公司自动化培训成本,让公司的测试工程师都可以开展自动化测试)。 自动化测试框架根据思想理念和深度不同,渐进式的分为以下几种: 线性脚本框架 模块…...
python控制语句-1.2
目录 循环结构 while循环 for循环 循环结构练习-1 循环嵌套 循环结构练习-2 循环控制语句(continue & break) 循环结构 while循环 语法 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序&am…...
HTML 学习笔记(一)开始
一、介绍: 首先引用百度百科的一段话作为介绍: HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本…...
查看自己的ip地址的网站
有时候需要知道自己的ip地址,可以上这个网站查看: What Is My IP? Best Way To Check Your Public IP Address 网站的域名是https://www.whatismyip.com/ 还是挺好记的。...
ES分布式搜索-索引库操作
索引库操作 1、mapping映射属性 可以查看官方文档学习:ES官方手册 mapping是对索引库中文档的约束,常见的mapping属性包括: type:字段数据类型,常见的简单类型有: 字符串:text(可…...
Win11 没有网络bug
1.问题描述 没有网络,dns一直是固定的,但是dns已经是自动获取了(MAC地址随机) 2.解决办法 1.首先,删除所有网络的手动dns配置,控制中心那个dns管理没有用,在设置中删除网络,不然问题还会出现 - 2.然后,进入注册表\HKEY_LOCAL_MACH…...
洛谷 1025.数的划分
这道题用的知识点是DFS剪枝。难的不在DFS上,而是在剪枝上如何选择。 思路:这道题我们看到是按照字典序排的,但是,我们注意到,看似是全排列的递归,实则不是。 我们前面也了解过,全排列的数字大…...
MySQL实战:SQL优化及问题排查
有更合适的索引不走,怎么办? MySQL在选取索引时,会参考索引的基数,基数是MySQL估算的,反映这个字段有多少种取值,估算的策略为选取几个页算出取值的平均值,再乘以页数,即为基数 查…...
加密与安全_使用Java代码操作RSA算法生成的密钥对
文章目录 Pre概述什么是非对称加密算法?如何工作?示例:RSA算法特点和优势ECC:另一种非对称加密算法 Code生成公钥和私钥私钥加密私钥加密私钥解密 ( 行不通 )私钥加密公钥解密公钥加密和公钥解密 (行不通)保…...
Spring Boot中实现图片上传功能的两种策略
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...
07.axios封装实例
一.简易axios封装-获取省份列表 1. 需求:基于 Promise 和 XHR 封装 myAxios 函数,获取省份列表展示到页面 2. 核心语法: function myAxios(config) {return new Promise((resolve, reject) > {// XHR 请求// 调用成功/失败的处理程序}) …...
【Linux】第四十一站:线程控制
一、Linux线程VS进程 1.进程和线程 进程是资源分配的基本单位线程是调度的基本单位线程共享进程数据,但也拥有自己的一部分数据:线程ID一组寄存器(上下文)栈errno信号屏蔽字调度优先级 2.进程的多个线程共享 同一地址空间,因此Text Segment、…...
ChatGPT提示词工程:prompt和chatbot
ChatGPT Prompt Engineering for Developers 本文是 https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/ 这门课程的学习笔记。 ChatGPT提示词工程:prompt和chatbot 文章目录 ChatGPT Prompt Engineering for DevelopersWhat …...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
