UML图是一种统一建模语言(Unified Modeling Language
)的图形表示,用于描述软件系统的结构和行为。它是一种标准化的图形化语言,被广泛应用于软件开发领域,用于可视化、规划和构建软件系统。UML图提供了一种可视化的方法来描述系统的各个方面,包括静态结构、动态行为、交互和用例等。常见的UML图包括类图、用例图、时序图、活动图、状态图等。
下面是几个常见的分类:
Class Diagram
):描述系统中的类、属性和方法之间的关系,是静态结构的表示。Use Case Diagram
):描述系统中的功能需求和用户之间的交互,以及系统对外部实体的行为。Sequence Diagram
):描述系统中对象之间的交互顺序,特别适用于描述系统的动态行为。Activity Diagram
):描述系统中的活动流程和控制流程,用于展示系统中的业务流程或算法流程。State Diagram
):描述系统中对象的状态以及状态之间的转换,用于表示对象在不同状态下的行为变化。关注公众号“月上老狗”,发送“软件设计师”,获取历年软件设计师软考真题。
提示:本地新建 html
文件,拷贝代码填入文件后,浏览器查看即可查看效果。
html<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Collapsible Tree with D3.js</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
<style>
/* 定义节点样式 */
.node {
cursor: pointer;
}
.node circle {
fill: #fff;
stroke: steelblue;
stroke-width: 3px;
}
.node text {
font: 12px sans-serif;
}
.link {
fill: none;
stroke: #ccc;
stroke-width: 2px;
}
</style>
</head>
<body>
<script>
// 定义树数据结构
var treeData = {
name: "Root",
children: [
{
name: "Child 1",
children: [
{ name: "Grandchild 1.1" },
{ name: "Grandchild 1.2" }
]
},
{ name: "Child 2" }
]
};
// 定义树图的边距和尺寸
var margin = { top: 20, right: 120, bottom: 20, left: 120 },
width = 960 - margin.right - margin.left,
height = 500 - margin.top - margin.bottom;
var i = 0,
duration = 750, // 动画持续时间
root;
// 创建树布局
var tree = d3.tree().size([height, width]);
// 创建对角线生成器
var diagonal = d3.linkHorizontal().x(d => d.y).y(d => d.x);
// 创建SVG容器
var svg = d3.select("body").append("svg")
.attr("width", width + margin.right + margin.left)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
// 将数据转换为树节点
root = d3.hierarchy(treeData, d => d.children);
root.x0 = height / 2;
root.y0 = 0;
// 初始折叠函数,递归折叠所有子节点
function collapse(d) {
if (d.children) {
d._children = d.children; // 将子节点保存到隐藏节点中
d._children.forEach(collapse);
d.children = null; // 清空子节点,实现折叠
}
}
// 初始化时折叠所有子节点
root.children.forEach(collapse);
update(root); // 更新树图
function update(source) {
// 将数据映射为树布局
var treeData = tree(root);
// 获取所有节点和链接
var nodes = treeData.descendants(),
links = treeData.links();
// 标准化节点深度
nodes.forEach(d => { d.y = d.depth * 180 });
// ****************** 节点部分 ******************
// 使用唯一ID绑定数据
var node = svg.selectAll('g.node')
.data(nodes, d => d.id || (d.id = ++i));
// 为新节点添加g元素
var nodeEnter = node.enter().append('g')
.attr('class', 'node')
.attr('transform', d => 'translate(' + source.y0 + ',' + source.x0 + ')')
.on('click', click); // 绑定点击事件
// 添加圆形元素表示节点
nodeEnter.append('circle')
.attr('r', 1e-6)
.style('fill', d => d._children ? "lightsteelblue" : "#fff");
// 添加文本标签
nodeEnter.append('text')
.attr('dy', '.35em')
.attr('x', d => d.children || d._children ? -13 : 13)
.attr('text-anchor', d => d.children || d._children ? "end" : "start")
.text(d => d.data.name);
// 过渡更新节点
var nodeUpdate = nodeEnter.merge(node);
// 将节点过渡到新位置
nodeUpdate.transition()
.duration(duration)
.attr('transform', d => 'translate(' + d.y + ',' + d.x + ')');
// 更新节点样式
nodeUpdate.select('circle')
.attr('r', 10)
.style('fill', d => d._children ? "lightsteelblue" : "#fff");
// 过渡移除旧节点
var nodeExit = node.exit().transition()
.duration(duration)
.attr('transform', d => 'translate(' + source.y + ',' + source.x + ')')
.remove();
// 在退出时缩小节点
nodeExit.select('circle')
.attr('r', 1e-6);
nodeExit.select('text')
.style('fill-opacity', 1e-6);
// ****************** 链接部分 ******************
// 使用唯一ID绑定数据
var link = svg.selectAll('path.link')
.data(links, d => d.target.id);
// 为新链接添加path元素
var linkEnter = link.enter().insert('path', 'g')
.attr('class', 'link')
.attr('d', d => {
var o = { x: source.x0, y: source.y0 };
return diagonal({ source: o, target: o });
});
// 过渡更新链接
var linkUpdate = linkEnter.merge(link);
// 将链接过渡到新位置
linkUpdate.transition()
.duration(duration)
.attr('d', diagonal);
// 过渡移除旧链接
var linkExit = link.exit().transition()
.duration(duration)
.attr('d', d => {
var o = { x: source.x, y: source.y };
return diagonal({ source: o, target: o });
})
.remove();
// 将旧位置存储以便过渡
nodes.forEach(d => {
d.x0 = d.x;
d.y0 = d.y;
});
// 点击事件处理函数
function click(event, d) {
if (d.children) {
d._children = d.children;
d.children = null; // 折叠子节点
} else {
d.children = d._children;
d._children = null; // 展开子节点
}
update(d); // 更新树图
}
}
</script>
</body>
</html>
记录一下这个脚本,以后有需要可以来参考。
pythonimport os
import sys
def rename_files(folder_path):
# 遍历指定文件夹下的所有文件
for filename in os.listdir(folder_path):
# 检查文件是否是文件而不是文件夹
if os.path.isfile(os.path.join(folder_path, filename)):
# 检查文件名是否以'.mp4'结尾
if filename.endswith('.mp4'):
# 提取新文件名(删除原名称中‘ 中文字幕’开始到‘.mp4’之前的全部内容)
new_filename = filename.split(' 中文字幕')[0].split('.mp4')[0] + '.mp4'
# 重命名文件
os.rename(os.path.join(folder_path, filename), os.path.join(folder_path, new_filename))
print(f'Renamed {filename} to {new_filename}')
if __name__ == "__main__":
# 检查命令行参数是否提供了文件夹路径
if len(sys.argv) != 2:
print("Usage: python rename_files.py <folder_path>")
else:
folder_path = sys.argv[1]
# 检查文件夹路径是否存在
if not os.path.isdir(folder_path):
print(f"Error: Folder '{folder_path}' does not exist.")
else:
# 调用函数处理文件夹中的文件
rename_files(folder_path)
本文用于记录软考中,关于系统设计、架构设计、编程思想相关的题目。 包括但不限于:
这部分知识点大多需要有一定的工作经验才好理解。如有想要记录的题目,欢迎评论补充!
关注公众号“月上老狗”,发送“软件设计师”,获取历年软件设计师软考真题。
本文用于记录软考中,关于计算机基础和操作系统相关的考试题目,因为这两部分的知识点很零散,每次考试不一定考到哪些知识点,所以可能会记录很多题目。
包括但不限于:
如有想要记录的题目,欢迎评论补充!
关注公众号“月上老狗”,发送“软件设计师”,获取历年软件设计师软考真题。