Django 简易PACS读片系统

1、Django中写一个后端接口,给HTML提供dicom文件接口的方式

1、首先创建django项目

1、下载安装跨域的包
pip3 install django-cors-headers
2、使用pycharm创建一个Django项目

请添加图片描述

3、点击创建在另一个窗口,这个都无所谓,怎么都行,就是打开这个项目
4、创建成功的项目就是下面这个样子

请添加图片描述

5、先修改几个选项,后面好操作

下面是我的settings设置,我把修改的地方标注出来

"""
Django settings for pacsdemo project.Generated by 'django-admin startproject' using Django 3.2.18.For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
# 添加这个import os
import os
from pathlib import Path# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-uv!_mka##8#citwx_q$o71)@!8tfaa-6wyrb!h8&4fm+m-=-d='# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# 设置所有IP都可以访问,局域网
ALLOWED_HOSTS = ['*']# Application definition# 添加跨域设置
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','pacs.apps.PacsConfig','corsheaders'  # 跨域设置
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]# 新添加的设置
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_ALL_ORIGINS = False
CORS_ORIGIN_WHITELIST = ["http://192.168.0.30:8000","http://localhost:63409",
]
CORS_ORIGIN_ALLOW_ALL = TrueCORS_ALLOW_METHODS = ('DELETE','GET','OPTIONS','PATCH','POST','PUT','VIEW'
)CORS_ALLOW_HEADERS = ('accept','accept-encoding','authorization','content-type','dnt','origin','user-agent','x-csrftoken','x-requested-with',
)ROOT_URLCONF = 'pacsdemo.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [BASE_DIR / 'templates'],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'pacsdemo.wsgi.application'# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases# 连接本地的mysql数据库
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'pacsdemo',   #  你的数据库名称'USER': '******',  # 你的账户'PASSWORD': '******',  #你的密码'HOST': '127.0.0.1','PORT': '3306',}
}# Password validation
# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/# 设置时间,上海的时间
LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = False# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/# 加载静态文件的设置
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),
]# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-fieldDEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
6、把表结构映射到数据库中

连接数据库的设置,没有这个设置,数据库会连接失败

import pymysql
pymysql.install_as_MySQLdb()

请添加图片描述

7、在终端运行两行命令
python manage.py makemigrations

请添加图片描述

8、运行第二行命令
python manage.py migrate

请添加图片描述

9、第一步完成,数据库连接成功,基础设置完成

2、写前端页面,并且和后端接口,传递单个dicom文件,并且显示出来

1、先添加一个路由

from django.conf.urls import include

请添加图片描述

2、然后在pacs中写urls.py里面的内容

from django.urls import pathfrom . import viewsurlpatterns = [path("index/", views.index),  # 设置首页内容path("read/", views.read),  # 读dicom文件path("read1/", views.read1),  # 读dicom文件
]

请添加图片描述

3、写这个index的方法,在views.py中

from django.shortcuts import render
from django.http import HttpResponse, FileResponse# Create your views here.
def index(request):return render(request, 'index.html')def read(request):file = open('static/dicom/C9214289', 'rb')response = FileResponse(file)response['Content-Type'] = 'application/octet-stream'response['Content-Disposition'] = 'attachment;filename="1.dcm"'return responsedef read1(request):file = open('static/dicom/C9214530', 'rb')response = FileResponse(file)response['Content-Type'] = 'application/octet-stream'response['Content-Disposition'] = 'attachment;filename="2.dcm"'return response

请添加图片描述

4、写index.html的内容

我写的这个html,直接放进去就可以看,其中的内容你可以通过cornerstone.js查看

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>pacs</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script type="text/javascript">// 阻止右键点击事件的默认行为document.addEventListener('contextmenu', function (event) {event.preventDefault();});</script><script>// 监听双击事件,并阻止默认的缩放行为document.addEventListener('dblclick', function (event) {event.preventDefault();});document.addEventListener('touchstart', function (event) {if (event.touches.length > 1) {event.preventDefault();}}, {passive: false});</script>
</head>
<body>
<div><h2>全部都是鼠标左键的操作</h2><button id="wwwc">切换窗宽窗位</button><button id="length">切换测量长度</button><button id="rotate">旋转</button><button id="magnify">透视</button><button id="pan">移动</button><br/><button id="scaleoverlay">尺度</button><button id="zoom">放大</button><button id="angle">测量角度</button><button id="arrowannotate">添加备注</button><button id="bidirectional">交叉线</button><br/><button id="cobbangle">心胸比</button><button id="ellipticalroi">圆</button><button id="freehandroi">随便画</button><button id="probe">探针</button><button id="rectangleroi">方形</button><br/><button id="circlescissors">画圆</button><button id="rectanglescissors">画正方形</button>
</div>
<div id="dicomImage" style="width: 512px;height: 512px;position: absolute"></div></body>
<!-- 触控的方法 -->
<script src="https://unpkg.com/hammerjs@2.0.8/hammer.js"></script>
<!-- 基石包,核心包 -->
<script src="https://unpkg.com/cornerstone-core@2.6.1/dist/cornerstone.js"></script>
<!-- Math包,数学包 -->
<script src="https://unpkg.com/cornerstone-math@0.1.10/dist/cornerstoneMath.min.js"></script>
<!-- 图片解析包,解析dcm文件的 -->
<script src="https://unpkg.com/cornerstone-wado-image-loader@4.13.2/dist/cornerstoneWADOImageLoader.bundle.min.js"></script>
<!-- 解析普通图的方法 -->
<script src="https://unpkg.com/cornerstone-web-image-loader@2.1.1/dist/cornerstoneWebImageLoader.min.js"></script>
<!-- 写好方法的包 -->
<script src="https://unpkg.com/cornerstone-tools@6.0.10/dist/cornerstoneTools.js"></script>
<!-- 解析dicom的json信息 -->
<script src="https://unpkg.com/dicom-parser@1.8.21/dist/dicomParser.min.js"></script><script>cornerstoneTools.external.cornerstone = cornerstone;cornerstoneTools.external.cornerstoneMath = cornerstoneMath;cornerstoneTools.external.Hammer = Hammer;cornerstoneWADOImageLoader.external.dicomParser = dicomParser;cornerstoneWADOImageLoader.external.cornerstone = cornerstone;// 'dicomweb' 网页上的一种解析的包, http开头的网址 ,获取dicom的文件,并且显示出来var imageId = "wadouri:http://127.0.0.1:8000/read";var imageIds = ["wadouri:http://127.0.0.1:8000/read", "wadouri:http://127.0.0.1:8000/read1"]// 定义stack滚动工具const StackScrollMouseWheelTool = cornerstoneTools.StackScrollMouseWheelTool// Add our tool, and set it's modeconst StackScrollTool = cornerstoneTools.StackScrollTool//define the stack// 设置一个栈const stack = {currentImageIdIndex: 0,imageIds}// 默认初始化toolscornerstoneTools.init()// 获取页面显示的dicom idvar element = document.getElementById('dicomImage');cornerstone.enable(element)// 测量长度const LengthTool = cornerstoneTools.LengthTool;cornerstoneTools.addTool(LengthTool)// cornerstoneTools.setToolActive('Length', {mouseButtonMask: 1})// wwwcconst WwwcTool = cornerstoneTools.WwwcTool;cornerstoneTools.addTool(WwwcTool)// cornerstoneTools.setToolActive('Wwwc', {mouseButtonMask: 1})// 旋转const RotateTool = cornerstoneTools.RotateTool;cornerstoneTools.addTool(RotateTool)// 透视const MagnifyTool = cornerstoneTools.MagnifyTool;cornerstoneTools.addTool(MagnifyTool)// 移动const PanTool = cornerstoneTools.PanTool;cornerstoneTools.addTool(PanTool)// 尺度const ScaleOverlayTool = cornerstoneTools.ScaleOverlayTool;cornerstoneTools.addTool(ScaleOverlayTool)// 放大const ZoomTool = cornerstoneTools.ZoomTool;cornerstoneTools.addTool(cornerstoneTools.ZoomTool, {// Optional configurationconfiguration: {invert: false,preventZoomOutsideImage: false,minScale: .1,maxScale: 20.0,}});// 测量角度const AngleTool = cornerstoneTools.AngleTool;cornerstoneTools.addTool(AngleTool)// 添加备注const ArrowAnnotateTool = cornerstoneTools.ArrowAnnotateTool;cornerstoneTools.addTool(ArrowAnnotateTool)// 交叉线const BidirectionalTool = cornerstoneTools.BidirectionalTool;cornerstoneTools.addTool(BidirectionalTool)// 心胸比const CobbAngleTool = cornerstoneTools.CobbAngleTool;cornerstoneTools.addTool(CobbAngleTool)// 圆const EllipticalRoiTool = cornerstoneTools.EllipticalRoiTool;cornerstoneTools.addTool(EllipticalRoiTool)// 画笔const FreehandRoiTool = cornerstoneTools.FreehandRoiTool;cornerstoneTools.addTool(FreehandRoiTool)// 探针const ProbeTool = cornerstoneTools.ProbeTool;cornerstoneTools.addTool(ProbeTool)// 正方形长方形const RectangleRoiTool = cornerstoneTools.RectangleRoiTool;cornerstoneTools.addTool(RectangleRoiTool)// 直接画圆const CircleScissorsTool = cornerstoneTools.CircleScissorsTool;cornerstoneTools.addTool(CircleScissorsTool)// 通过正方形涂const RectangleScissorsTool = cornerstoneTools.RectangleScissorsTool;cornerstoneTools.addTool(RectangleScissorsTool)// 鼠标中键滚动cornerstone.loadAndCacheImage(imageIds[0]).then(function (image) {cornerstone.displayImage(element, image)cornerstoneTools.addStackStateManager(element, ['stack'])cornerstoneTools.addToolState(element, 'stack', stack)})cornerstoneTools.addTool(StackScrollMouseWheelTool)cornerstoneTools.setToolActive('StackScrollMouseWheel', {})function disableAllTools() {// 取消左键的功能cornerstoneTools.setToolDisabled('Length')cornerstoneTools.setToolDisabled('Wwwc')cornerstoneTools.setToolDisabled('Rotate')cornerstoneTools.setToolDisabled('Magnify')cornerstoneTools.setToolDisabled('ScaleOverlay')cornerstoneTools.setToolDisabled('Zoom')cornerstoneTools.setToolDisabled('Angle')cornerstoneTools.setToolDisabled('ArrowAnnotate')cornerstoneTools.setToolDisabled('Pan')cornerstoneTools.setToolDisabled('Bidirectional')cornerstoneTools.setToolDisabled('CobbAngle')cornerstoneTools.setToolDisabled('EllipticalRoi')cornerstoneTools.setToolDisabled('FreehandRoi')cornerstoneTools.setToolDisabled('Probe')cornerstoneTools.setToolDisabled('RectangleRoi')cornerstoneTools.setToolDisabled('CircleScissors')cornerstoneTools.setToolDisabled('RectangleScissors')}document.getElementById("wwwc").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活窗宽窗位cornerstoneTools.setToolActive("Wwwc", {mouseButtonMask: 1})})document.getElementById("length").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活测量长度cornerstoneTools.setToolActive("Length", {mouseButtonMask: 1})})document.getElementById("rotate").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活旋转cornerstoneTools.setToolActive("Rotate", {mouseButtonMask: 1})})document.getElementById("magnify").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活透视cornerstoneTools.setToolActive("Magnify", {mouseButtonMask: 1})})document.getElementById("pan").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 移动cornerstoneTools.setToolActive("Pan", {mouseButtonMask: 1})})document.getElementById("scaleoverlay").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 尺子cornerstoneTools.setToolActive("ScaleOverlay", {mouseButtonMask: 1})})document.getElementById("zoom").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 放大cornerstoneTools.setToolActive("Zoom", {mouseButtonMask: 1})})document.getElementById("angle").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 角度cornerstoneTools.setToolActive("Angle", {mouseButtonMask: 1})})document.getElementById("arrowannotate").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 添加备注cornerstoneTools.setToolActive("ArrowAnnotate", {mouseButtonMask: 1})})document.getElementById("bidirectional").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活交叉线cornerstoneTools.setToolActive("Bidirectional", {mouseButtonMask: 1})})document.getElementById("cobbangle").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活心胸比cornerstoneTools.setToolActive("CobbAngle", {mouseButtonMask: 1})})document.getElementById("ellipticalroi").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 圆cornerstoneTools.setToolActive("EllipticalRoi", {mouseButtonMask: 1})})document.getElementById("freehandroi").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 随便画cornerstoneTools.setToolActive("FreehandRoi", {mouseButtonMask: 1})})document.getElementById("probe").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 探针cornerstoneTools.setToolActive("Probe", {mouseButtonMask: 1})})document.getElementById("rectangleroi").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 方形cornerstoneTools.setToolActive("RectangleRoi", {mouseButtonMask: 1})})document.getElementById("circlescissors").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 方形cornerstoneTools.setToolActive("CircleScissors", {mouseButtonMask: 1})})document.getElementById("rectanglescissors").addEventListener('click', function () {// 取消左键原来的功能disableAllTools();// 激活 方形cornerstoneTools.setToolActive("RectangleScissors", {mouseButtonMask: 1})})</script></html>

5、启动项目

1、第一种,通过pycharm打开

请添加图片描述请添加图片描述

2、第二种,命令行的方式
python manage.py runserver

5、查看网页

其中的功能都可以进行操作,后续我进行优化,默认滚动条是切换dicom

http://127.0.0.1:8000/index/

请添加图片描述

6、成功

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

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

相关文章

Hadoop Yarn 配置多队列的容量调度器

文章目录 配置多队列的容量调度器多队列查看 配置多队列的容量调度器 首先&#xff0c;我们进入 Hadoop 的配置文件目录中&#xff08;$HADOOP_HOME/etc/hadoop&#xff09;&#xff1b; 然后通过编辑容量调度器配置文件 capacity-scheduler.xml 来配置多队列的形式。 默认只…

安防监控平台EasyCVR视频汇聚平台增加首页告警类型的详细介绍

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

基于智和网管平台的网络安全运维解决方案

随着信息技术的快速发展及网络应用的广泛普及&#xff0c;企业在享受网络技术带来便利的同时&#xff0c;也受到日益严重的网络安全威胁。未来&#xff0c;企业信息系统规模和复杂程度将不断增大&#xff0c;对信息通信技术的应用也将不断深入&#xff0c;网络安全运维将成为愈…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态&#xff0c;我们的愿景是&#xff1a;定义移动时代最佳体验&#xff0c;建设智能小程序行业标准&#xff0c;打破孤岛&#xff0c;共建开源、开放、繁荣的小程序行业生态。百度智…

webrtc学习(七)-媒体协商

一.概述 媒体协商嘴主要的作用就是看通信双方都支持那些编解码器&#xff0c;这些编解码器又包含那些参数&#xff0c;比如音频的参数包括采样率&#xff0c;采样大小&#xff0c;通道数&#xff0c;对于视频的参数包括分辨率帧率等一系列参数&#xff0c;此外传输中用的payloa…

Linux 发行版 Debian 宣布支持龙芯 LoongArch 架构

近期&#xff0c;龙芯发布了 3A6000 桌面处理器&#xff0c;芯片的性能又一次大幅度提升&#xff0c;成为国产芯片的又一里程碑。 同期&#xff0c;LoongArch 架构的生态建设也迅速提升&#xff0c;开源网络引导固件 iPXE、QQ Linux 版、摩尔线程等软硬件都官宣支持龙芯 Loong…

VMware 修改ip地址 虚拟机静态ip设置 centos动态ip修改为静态ip地址 centos静态ip地址 vmware修改ip地址

虚拟机的centos服务器经常变换ip&#xff0c;测试起来有些麻烦&#xff0c;故将动态ip修改为静态ip 1. 查看vmware 虚拟机网络配置&#xff1a; 点击编辑&#xff0c;打开虚拟网络配置 2. 选中nat模式&#xff0c;点击nat设置&#xff0c;最终获取网关ip: 192.168.164.2 3. 进…

拒绝摆烂!C语言练习打卡第六天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

Golang struct 结构体注意事项和使用细节

结构体所有字段在内存当中是连续的 type Point struct {x, y int }type Rect struct {leftUp, rightDown Point }func main() {//r1会在内存当中有四个整数r1 : Rect{leftUp: Point{x: 1,y: 2,},rightDown: Point{x: 3,y: 4,},}//r1有四个int&#xff0c;在内存当中是连续分布的…

基于Java+SpringBoot+Vue前后端分离社区智慧养老监护管理平台设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Python——列表(list)推导式

本文基于python3。 目录 1、Python推导式2、列表(list)推导式2.1、定义2.2、实际操作2.2.1、一个表达式&#xff0c;后面为一个 for 子句2.2.2、一个表达式&#xff0c;后面为一个 for 子句&#xff0c;然后&#xff0c;跟着if 子句。2.2.3、一个表达式&#xff0c;后面为一个…

vscode 与 C++

序 具体流程的话&#xff0c;官方文档里都有的&#xff1a;C programming with Visual Studio Code 浏览器下载一个mingw64&#xff0c;解压&#xff0c;配置环境变量vscode里安装c相关的插件没了 第一步只看文字&#xff0c;可能有点抽象&#xff0c;相关视频&#xff1a; …

24 WEB漏洞-文件上传之WAF绕过及安全修复

目录 WAF绕过上传参数名解析:明确哪些东西能修改?常见绕过方法&#xff1a;符号变异-防匹配( " ;)数据截断-防匹配(%00 ; 换行)重复数据-防匹配(参数多次)搜索引擎搜索fuzz web字典文件上传安全修复方案 WAF绕过 safedog BT(宝塔) XXX云盾 宝塔过滤的比安全狗厉害一些&a…

全流程R语言Meta分析核心技术教程

详情点击链接&#xff1a;全流程R语言Meta分析核心技术教程 一&#xff0c;Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)精确检索策略&#xff0c;如何检索全、检索准 4)文献的管理与清洗&#xff0c;如何制定文…

【Acwing291】蒙德里安的梦想(状态压缩dp)详细讲解

题目描述 题目分析 显而易见的重要事实 首先&#xff0c;需要明白一个很重要的事实&#xff1a; 所有的摆放方案数所有横着摆放且合理的方案数 这是因为&#xff0c;横着的确定之后&#xff0c;竖着的一定会被唯一确定&#xff0c;举一个例子&#xff1a; ------唯一确定-…

gma 2 教程(二)数据操作:6.NumPy数组交互

gma 栅格数据集可以通过 ToArray 方法将栅格数据转为NumPy数组&#xff0c;也提供将NumPy数据转换为栅格数据&#xff08;集&#xff09;的方法。 读取NumPy数组到数据集 &#xff08;一&#xff09;函数简介   &#xff08;二&#xff09;示例 保存NumPy数组到文件 &…

C++笔记之智能指针和单例、依赖注入结合使用

C笔记之智能指针和单例、依赖注入结合使用 code review! 文章目录 C笔记之智能指针和单例、依赖注入结合使用例1.一个类不使用单例&#xff0c;另一个类使用单例例2.两个类都使用单例&#xff0c;并且通过getInstance()传入类的实例例3.std::make_unique不能访问私有的构造函…

5.基于多能互补的热电联供型微网优化运行

MATLAB代码链接&#xff1a;基于多能互补的热电联供型微网优化运行 MATLAB代码&#xff1a;基于多能互补的热电联供型微网优化运行 关键词&#xff1a;多能互补 综合需求响应 热电联产 微网 优化调度 参考文档&#xff1a;《基于多能互补的热电联供型微网优化运行》基本完全…

【云原生】Docker的数据管理(数据卷、容器互联)

目录 一、数据卷&#xff08;容器与宿主机之间数据共享&#xff09; 二、数据卷容器&#xff08;容器与容器之间数据共享&#xff09; 三、 容器互联&#xff08;使用centos镜像&#xff09; 总结 用户在使用Docker的过程中&#xff0c;往往需要能查看容器内应用产生的数据…

【android12-linux-5.1】【ST芯片】HAL移植后配置文件生成报错

根据ST官方源码移植HAL源码后&#xff0c;执行readme指示中的生成配置文件指令时报错ST_HAL_ANDROID_VERSION未定义之类&#xff0c;应该是编译环境参数问题。makefile文件中是自动识别配置的&#xff0c;参数不祥就会报错&#xff0c;这里最快的解决方案是查询确定自己android…