使用Neo4j做技术血缘管理
目录
一、neo4j介绍
二、windows安装启动neo4j
2.1下载neo4j
2.2 解压文件
2.3 启动neo4j
三、neo4j基础操作
3.1 创建结点和关系
3.2 查询
3.3 更改
3.4 删除
四、技术血缘Demo实现
4.1 构建节点对象
4.2 构建存储对象
4.3 创建有属性关联关系
4.4 最后是图结果
五、总结
前言:对于大公司或大部门,团队之间相互合作、中间件的共同使用,技术之间细节是不透明的,遇到异常问题时,定位排查困难;如何清晰管理技术团队、中间件、数据之间的血缘关系,这成为技术、产品、数据开发等人员的一个需求。
一、neo4j介绍
Neo4j 是一种开源的图数据库管理系统,专注于存储和处理图结构数据。图数据库是一种专为处理图形和网络结构而设计的数据库,其中的数据以节点和边(或称关系)的形式组成。Neo4j 提供了一种直观而高效的方式来表示和查询复杂的关系数据,使得它特别适用于需要处理强关联和复杂网络结构的场景。
以下是 Neo4j 的主要特点和功能:
- 图数据库模型: Neo4j 使用图数据库模型,其中的数据被组织成节点和关系的网络。节点表示实体,关系表示实体之间的关联,而节点和关系都可以包含属性。
- Cypher 查询语言: Neo4j 使用 Cypher 查询语言,这是一种专门用于图数据库的查询语言。Cypher 提供了一种直观且强大的方式来查询和修改图数据,支持模式匹配、路径查询、聚合等操作。
- 性能优化: Neo4j 通过采用类似索引结构的存储引擎,可以快速地执行复杂的图查询。它还支持深度优先和广度优先的图遍历,以及通过索引快速查找节点和关系。
- ACID 事务支持:Neo4j 提供 ACID(原子性、一致性、隔离性、持久性)事务支持,确保数据库的数据一致性和可靠性。
- 灵活的数据模型: Neo4j 的数据模型非常灵活,可以轻松地表示多对多、多对一、一对多等各种关系。这使得它在处理复杂网络结构和强关联数据时非常强大。
- 支持图算法: Neo4j 提供了一系列内置的图算法,如最短路径、广度优先搜索、社交网络中的社区发现等,帮助用户进行更复杂的图分析。
- 可视化工具: Neo4j 提供了直观的可视化工具,使用户能够直观地查看和理解图数据的结构。这有助于开发人员和分析师更好地理解数据和关系。
- 社区和生态系统:Neo4j 拥有一个活跃的开源社区,提供了大量的文档、示例和插件。此外,它还有丰富的生态系统,包括各种工具和驱动程序,与其他数据存储和处理系统集成。
Neo4j 在许多应用领域中得到广泛应用,包括社交网络分析、推荐系统、生物信息学、网络安全分析等。其图数据库的模型和查询语言使其成为处理复杂关系数据的强大工具。
二、windows安装启动neo4j
2.1下载neo4j
1.从官网下载:https://neo4j.com/download/
2.直接获取资源包(上手推荐):https://dist.neo4j.org/neo4j-community-3.5.30-windows.zip
2.2 解压文件
点击解压:

2.3 启动neo4j
在neo4j的bin目录下运行:CMD

启动服务:neo4j.bat console

在页面登录链接:http://localhost:7474/
默认账号密码:一般默认的是:用户:neo4j, 密码:neo4j;登陆后重新设置密码,如:123456
UI页面:

三、neo4j基础操作
有四个基础概念:
- 节点
- 标签
- 属性
- 关系
3.1 创建结点和关系
创建结点:
3.1.1创建只有一个标签没有属性的节点:
语法:CREATE (node-name:label-name)
示例:CREATE (m:sdk)
注解:"()"里”:“前第一个”m“是结点别名,":"后第二个"sdk"是结点标签;别名可以随意写,标签固定。
3.1.2创建一个有属性的节点:
语法:CREATE ( node-name:label-name { key:Value })
示例:create (mobile:sdk {name:"name1"})
注解:"{}"里是属性,以json格式展示。
3.1.3创建多个标签到节点:
语法:CREATE (node-name:label-name1:label-name2.....:label-namen)
示例:CREATE (m:sdk:usercode {name:"name1"})
注解:以上创建了一个,当前别名为m,标签为sdk和usercode,属性name="name1"的结点;
创建关系:
3.1.4各两个新结点创建无属性关系
create(m:sdk{type:'SDK'})-[r:write]->(n:api{name:'lxApi'})
return m,r,n
3.1.5给两个存在节点创建有属性关系
match(m:sdk{type:'SDK'})
match(n:api{name:'lxApi'})
create(m)-[r:upZip]->(n)
return n,m,r
3.2 查询
- 从数据库获取有关节点和属性的数据
- 从数据库获取有关节点,关系和属性的数据
MATCH检索,Return返回信息;
通过标签查询:
语法:MATCH(node-name:label-name)
示例:示例:MATCH (m:sdk) return m
通过标签属性查询:
语法:MATCH(node-name:label-name{filed:'value1'})
示例:示例:MATCH (n:sdk{name:'name1'}) eturn n
3.3 更改
添加标签:
match (m:sdk{name:'name1'})
SET m:sdk:user
RETURN m;
添加属性:
match (m:sdk{name:'name1'})
set m.userName='user1'
return m
3.4 删除
通过id来删除
match(n) where id(n)=86
delete n
通过属性来删除
match(n:sdk{name:'name1'})
delete n
通过标签来删除
match(n:sdk)
delete n
删除节点关系再删除节点
match(n) where id(n)=34
match(m) where id(m)=30
match(n)-[r:write]-(m)
delete r
删除结点属性
MATCH (n:sdk{name:'lxApi'})
remove n.name
return n
删除结点标签
match(n:sdk{name:'name1'})
remove n:userName
return n
删除节点和节点关联关系
MATCH (s:sdk{name:'name1'})
DETACH DELETE s;
删除所有节点
MATCH (n)
DETACH DELETE n
删除所有关系
start r=relationship(*) delete r;
四、技术血缘Demo实现
本次技术血缘demo涉及三个团队,三个中间件,用neo4j图数据库构建技术血缘关系。
通过SDK采集移动端APP的数据,内部API用于管理采集服务,最后依次存储到HDFS、Kafka、ES。
4.1 构建节点对象
1.业务服务对象创建
构建采集节点(SDK):
create(m:sdk:mobile{name:'yzSdk',type:'SDK',message:'驿站SDK,app消息采集'} )
create(m:sdk:mobile{name:'jscSdk',type:'SDK',message:'驾驶舱SDK,app消息采集'})
create(m:sdk:mobile{name:'xcSdk',type:'SDK',message:'星辰SDK,app消息采集'})
create(m:sdk:mobile{name:'xzSdk',type:'SDK',message:'行者SDK,app消息采集'})
查询sdk节点: MATCH (e:sdk) RETURN e

2.构建采集API管理对象数据节点:
create(n:api:xlp{name:'lxApi',type:'api',message:'离线API,提交zip包,存储元数据到kafka'})
create(n:api:xlp{name:'ssApi',type:'api',message:'实时API,上传实时数据到kafka'})
2.1构建配置索引接口节点
create(n:api:xlp{name:'configApi',type:'api',message:'配置索引,将消息写入不同索引库'})
查询Api节点:MATCH (n:api) RETURN n

4.2 构建存储对象节点
构建hdfs存储对象:
create(s:hdfs:xlp{name:'hdfs_file',hosts:'ipList',type:'hdfs',message:'移动端离线上传zip包,hdfs存储地址'})
构建Kafka元数据存储Topic:
create(s:kafka:xlp{topic:'id_metadata_info',hosts:'ipList',type:'kafka',message:'移动端离线上传zip包,元数据信息'})
构建kafka存储Topic:
create(s:kafka:xlp{topic:'XLP_MOBILE_LOG',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存储移动端解压数据'})
create(s:kafka:xlp{topic:'xlp-log-body',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存储移动端实时上传数据'})
create(s:kafka:xlp{topic:'id_m_crash',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存储移动端实时上传崩溃数据'})
查询Kafka存储节点:MATCH (s:kafka) RETURN s

构建ES存储索引:
create(s:es:xlp{index:'id_m_1000*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储移动端详情数据'})
create(s:es:xlp{index:'xlp_dev_appid_version_brand_record',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储app指标分析结果'})
create(s:es:xlp{index:'id_m_user_device_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储用户分析指标结果'})
create(s:es:xlp{index:'id_m_crash_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储移动端崩溃日志'})
create(s:es:xlp{index:'xlp_mobile_message_id_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储移动端崩溃message大字段信息'})
create(s:es:xlp{index:'id_network_*',hosts:'ipList',type:'es',message:'移动端上传网络详细'})
create(s:es:xlp{index:'id_m_1000*',hosts:'ipList',type:'es',message:'移动端上传,用户登录时长详情,增加UsedTime字段'})
create(s:es:xlp{index:'id_m_crash*',hosts:'ipList',type:'es',message:'移动端上传,崩溃详情索引'})
ES存储对象:MATCH (e:es) RETURN e

构建处理对象(Flink):
create(f:flink:xlp{name:'UnZipTask',type:'flink',message:'解压zip,读kafka,从HDFS获取zip解压,存入Kafka'})
create(f:flink:xlp{name:'MobileToEs',type:'flink',message:'读kafka,分发数据到不同索引'})
create(f:flink:xlp{name:'UserAnalToEs',type:'flink',message:'读topic,计算用户指标,结果存入es'})
create(f:flink:xlp{name:'fDevAnalToEs',type:'flink',message:'读topic,计算app指标j,结果存入es'})
create(f:flink:xlp{name:'ssMobileToES',type:'flink',message:'读实时topic,分发结果到es'})
查询Flink任务节点:MATCH (f:flink) RETURN f

4.3 创建有属性关联关系
4.3.1离线上传对象关联
match(m:sdk{type:'SDK'})
match(n:api{name:'lxApi'})
create(m)-[r:upZip]->(n)
return n,m,r
4.3.2实时上传数据关联
match(m:sdk{type:'SDK'})
match(n:api{name:'ssApi'})
create(m)-[r:toLineData]->(n)
return n,m,r
4.3.3 离线上传处理关联
记录元数据
match(n:api{name:'lxApi'})
match(h:kafka{topic:'id_metadata_info'})
create(n)-[r:mark]->(h)
return n,h,r
上传zip包
match(n:api{name:'lxApi'})
match(h:hdfs{name:'hdfs_file_name'})
create(n)-[r:mark]->(h)
return n,h,r
match(k:kafka{topic:'id_metadata_info'})
match(h:hdfs{name:'hdfs_file_name'})
create(k)-[r:relation]->(h)
return k,h,r
match(k:kafka{topic:'id_metadata_info'})
match(h:hdfs{name:'hdfs_file_name'})
create(k)elation]-(h)
return k,h,r
4.3.4 flink解压关联
match(k:kafka{topic:'id_metadata_info'})
match(f:flink{name:'UnZipTask'})
create(k)-[r:read]->(f)
return k,f,r
match(h:hdfs{name:'hdfs_file_name'})
match(f:flink{name:'UnZipTask'})
create(f)-[r:read]->(h)
return h,f,r
4.3.5 存储kafka关联
match(f:flink{name:'UnZipTask'})
match(k:kafka{topic:'XLP_MOBILE_LOG'})
create(f)-[r:read]->(k)
return k,f,r
4.3.6任务解析关联
UserAnalToEs 、fDevAnalToEs
match(k:kafka{topic:'XLP_MOBILE_LOG'})
match(f:flink{name:'UserAnalToEs'})
create(k)-[r:read]->(f)
return k,f,r
match(k:kafka{topic:'XLP_MOBILE_LOG'})
match(f:flink{name:'fDevAnalToEs'})
create(k)-[r:read]->(f)
return k,f,r
match(k:kafka{topic:'XLP_MOBILE_LOG'})
match(f:flink{name:'MobileToEs'})
create(k)-[r:read]->(f)
return k,f,r
4.3.7 ES任务存储关联
match(f:flink{name:'MobileToEs'})
match(e:es{index:'id_m_1000*'})
create(f)-[r:wirte]->(e)
return e,f,r
match(f:flink{name:'UserAnalToEs'})
match(e:es{index:'id_m_user_device_*'})
create(f)-[r:wirte]->(e)
return e,f,r
match(f:flink{name:'fDevAnalToEs'})
match(e:es{index:'xlp_dev_appid_version_brand_record'})
create(f)-[r:wirte]->(e)
return e,f,r
4.3.8 配置索引关联
match(a:api{name:'configApi'})
match(b:api{name:'lxApi'})
create(a)-[r:wirte]->(b)
return a,b,r
match(a:api{name:'configApi'})
match(b:api{name:'ssApi'})
create(a)-[r:wirte]->(b)
return a,b,r
match(a:api{name:'configApi'})
match(b:es{index:'id_m_1000*'})
create(a)-[r:wirte]->(b)
return a,b,r
4.3.9 实时任务存储关系
match(a:api{name:'ssApi'})
match(t:kafka{topic:'xlp-log-body'})
create(a)-[r:wirte]->(t)
return a,t,r
4.3.10 分发存储关系
match(t:kafka{topic:'xlp-log-body'})
match(e:es{index:'id_network_*'})
create(t)-[r:wirte]->(e)
return e,t,r
match(t:kafka{topic:'xlp-log-body'})
match(e:es{index:'id_m_1000*'})
create(t)-[r:wirte]->(e)
return e,t,r
4.3.11 崩溃日志关系
match(a:api{name:'ssApi'})
match(k:kafka{topic:'id_m_crash'})
create(a)-[r:uoData]->(k)
return a,k,r
match(k:kafka{topic:'id_m_crash'})
match(f:flink{name:'ssMobileToES'})
create(k)-[r:uoData]->(f)
return f,k,r
match(f:flink{name:'ssMobileToES'})
match(e:es{index:'id_m_crash*'})
create(f)-[r:wirte]->(e)
return e,f,r
4.4 最后是图结果

五、总结
技术血缘建立在数据血缘之上,除了可以在节点构建数据详情,映射管理数据血缘;还可以将数据整个数据生命周期过程的使用的技术细节,管理到血缘关系中。对数据管理人员、技术人员和产品经理等各方,都可以做到技术和数据的透明管理。
相关文章:
使用Neo4j做技术血缘管理
目录 一、neo4j介绍 二、windows安装启动neo4j 2.1下载neo4j 2.2 解压文件 2.3 启动neo4j 三、neo4j基础操作 3.1 创建结点和关系 3.2 查询 3.3 更改 3.4 删除 四、技术血缘Demo实现 4.1 构建节点对象 4.2 构建存储对象 4.3 创建有属性关联关系 4.4 最后是图结果…...
Unity-WebGL
问题:提示gzip压缩报错解决:关闭打包的地方压缩,如下图问题:窗口未全屏解决:使用百分比画布替换固定尺寸画布 参考:新版Unity打包Webgl端进行屏幕自适应_unity webgl分辨率自适应-CSDN博客问题:…...
腾讯云部署vue+node项目
文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…...
HBase表结构
HBase是非关系型数据库,是高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。 HBase使用场景 大规模数据存储:如日志记录、数据库备份等。实时数据访问:如实时搜索、实时分析等。高性能读写:如高并发、低延迟的读写操…...
本人面试积累面试题更新中
本人面试积累面试题 1.事务的隔离级别 答:2024年1月30日 1.读已提交-----读取其他事务已经提交的数据 2.读未提交-----读取其他事务还未提交的数据–可能出现脏读 3.可重复读-----同一个事务多次读取同一个数据,尽可能的保证数据的一致性但是可能出现幻读 4.串行读------确保每…...
[经典面试题]169. 多数元素
题目描述 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3] 输出:3…...
Wireshark网络协议分析 - TCP协议
在我的博客阅读本文 文章目录 1. 基础2. 实战2.1. 用Go写一个简单的TCP服务器与客户端2.2. Wireshark抓包分析2.3. 限制数据包的大小——MSS与MTU2.4. 保证TCP的有序传输——Seq,Len与Ack2.5. TCP头标志位——URG,ACK,PSH,RST&…...
3 款最好的电脑硬盘数据迁移软件
您将从本页了解 3 款最好的 SSD硬盘数据迁移软件,磁盘供应商提供的软件和可靠的第三方软件。仔细阅读本文并做出您的选择。 什么是数据迁移? 数据迁移是将数据移动到其他计算机或存储设备的过程。在日常工作活动中,常见的数据迁移有三种&…...
【Java之HTML】
HTML 概念 互联网的产生:w3c的成立, 互联网最开始设计的目的:看论文 ---->浏览器,HTML 网络三要素:HTML HTTP URL HTML描述论文的格式 HTTP标记这个论文在网络上怎么传输 URL:指示这个论文在互联网的哪…...
支付宝支付功能解析,从零到掌握,轻松享受便捷支付
目录 一、支付宝支付功能简介 1.1 支付宝支付的概念 1.2 支付宝支付的优势 1.3 支付宝支付的适用场景 二、支付宝支付的准备工作 三、支付宝支付的接入流程 四、支付宝支付的安全性 5.1 支付宝支付的安全机制 5.2 防范支付风险的措施 5.3 支付宝支付的安全技术保障 …...
MacOS安装反编译工具JD-GUI以及解决无法打开的问题
目录 一.下载地址 二.安装 三.问题 四.解决办法 1.显示包内容 2.找到Contents/MacOS/universalJavaApplicationStub.sh 3.修改sh文件 4.保存后再次打开即可 一.下载地址 Java Decompiler 二.安装 将下载下来的 jd-gui-osx-1.6.6.tar 解压,然后将 JD-GUI.a…...
SpringBoot将第三方的jar中的bean对象自动注入到ioc容器中
新建一个模块,做自动配置 config:需要准备两个类,一个自动配置类,一个配置类 CommonAutoConfig:此类用于做自动配置类它会去读取resoutces下的META-INF.spring下的org.springframework.boot.autoconfigure.AutoConfig…...
5.变量的解构赋值 - JS
什么是解构赋值 通过类似(或相同)的构型,将已知数据的元素/属性解构并提取出来,再赋值到相应变量,可以是新建的变量,也可以是已存在的变量/属性等;最常见的是数组和对象的解构赋值,…...
tableau添加形状
目录 1.效果:1.自带的形状:2.添加形状:小结: 1.效果: 1.自带的形状: 2.添加形状: 找到tableau的安装目录,点入 默认->形状 的文件夹: 新建一个文件夹: …...
(2)(2.10) LTM telemetry
文章目录 前言 1 协议概述 2 配置 3 带FPV视频发射器的使用示例 4 使用TCM3105的FSK调制解调器示例 前言 轻量级 TeleMetry 协议 (LTM) 是一种单向通信协议(从飞行器下行的数据链路),可让你以低带宽/低波特率(通常为 2400 波…...
工具推荐系列-极客编辑器(实时在线编写md文件同步GitHub)
工具项目地址:https://github.com/geekeditor/geekeditor-desktop-releases/tree/main 工具基础配置方法:https://www.geekeditor.com/workspace1.x.html 详细同步代码仓的方法可以用下面: 如何创建GitHub仓库 及生成获取AccessToken…...
3d gaussian splatting介绍整理
3D 高斯分布是用于实时辐射场渲染的 3D 高斯分布中描述的一种光栅化技术,它允许实时渲染从小图像样本中学习到的逼真场景。 paper github 本文翻译整理自: blog: Introduction to 3D Gaussian Splatting DDPMs - Part 2 给出一些2D图片,用…...
[C#]de4dot常用命令
命令:de4dot.exe "D:\xxx.exe" 解释:运行后文件在程序集的目录下生成一个带-cleaned的新程序集。 命令:de4dot.exe file1 -f "D:\xxx.exe" -o "D:\output\xxx_cleaned.exe" 解释:-f : 指定.NET 程序…...
林浩然的“生命体验”大冒险
林浩然的“生命体验”大冒险 Lin Haoran’s “Life Experience” Grand Adventure 在一个阳光明媚的日子,林浩然——我们这位幽默风趣、充满生活智慧的大男孩,正坐在自家后院的老槐树下,手捧一本哲学书,皱着眉头深思:“…...
设计模式——职责链模式(Chain of Responsibility Pattern)
概述 职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
AcWing 3417:砝码称重——位集合
【题目来源】 3417. 砝码称重 - AcWing题库 【题目描述】 你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,⋅⋅⋅,WN。 请你计算一共可以称出多少种不同的正整数重量? 注意砝码可以放在天平两边。 【输入格式】 输入的第一行包含一个整数 N。 …...
Flask与Celery 项目应用(shared_task使用)
目录 1. 项目概述主要功能技术栈 2. 项目结构3. 环境设置创建虚拟环境并安装依赖主要依赖 4. 应用配置Flask应用初始化 (__init__.py)Celery应用初始化 (make_celery.py) 5. 定义Celery任务 (tasks.py)任务说明 6. 创建API端点 (views.py)API端点说明 7. 前端界面 (index.html)…...
