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

【深度学习】fooocusapi,docker,inpainting图像

基础镜像制作来源

fooocusapi接口官方写的:

docker run -d --gpus=all \-e NVIDIA_DRIVER_CAPABILITIES=compute,utility \-e NVIDIA_VISIBLE_DEVICES=all \-p 8888:8888 konieshadow/fooocus-api

会下载一些模型,下载完后推这个镜像

docker commit 4dfd19dd1dc7 kevinchina/deeplearning:fooocusapi-office-v1

写个dockerfile:

FROM kevinchina/deeplearning:fooocusapi-office-v1
EXPOSE 7860
CMD ["python", "main.py", "--host", "0.0.0.0", "--port", "7860", "--skip-pip"]

构建一个新的镜像:

docker build -f Dockerfile . -t kevinchina/deeplearning:fooocusapi-office-v2
docker run -d --gpus=all -p 8881:7860 kevinchina/deeplearning:fooocusapi-office-v2

inpaint还需要下载一些东西,然年成为:

kevinchina/deeplearning:fooocusapi-office-v3

开启镜像

开启方式:

docker run --gpus device=0 -p 7881:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=0 -p 7882:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 7883:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 7884:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 7885:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=2 -p 7886:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=2 -p 7887:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=2 -p 7888:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=3 -p 7889:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=3 -p 7890:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=3 -p 7891:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=3 -p 7892:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=0 -p 8550:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=0 -p 8551:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 8552:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
docker run --gpus device=1 -p 8553:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3

多进程请求inpaint:

import base64
import io
import os
import traceback
from multiprocessing import Manager, Poolimport requests
import cv2
import numpy as np
import json
from PIL import Image
from PIL import ImageDraw
import numpy as np
import cv2
import pyclipper
from shapely.geometry import Polygon
# plt显示图
import matplotlib.pyplot as plt
from tqdm import tqdm
import jsondef expand_polygon_pyclipper(polygon, expand_ratio):polygon_shape = Polygon(polygon)distance = (polygon_shape.area * (np.power(expand_ratio, 2) - 1) / polygon_shape.length)subject = [tuple(l) for l in polygon]padding = pyclipper.PyclipperOffset()padding.AddPath(subject, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)expanded = padding.Execute(distance)if expanded == []:expanded = np.array(expanded)else:expanded = np.array(expanded[0]).reshape(-1, 2)return expandeddef shrink_polygon_pyclipper(polygon, expand_ratio):polygon_shape = Polygon(polygon)distance = (polygon_shape.area * (np.power(expand_ratio, 2) - 1) / polygon_shape.length)subject = [tuple(l) for l in polygon]padding = pyclipper.PyclipperOffset()padding.AddPath(subject, pyclipper.JT_ROUND, pyclipper.ET_CLOSEDPOLYGON)expanded = padding.Execute(-distance)if expanded == []:expanded = np.array(expanded)else:expanded = np.array(expanded[0]).reshape(-1, 2)return expanded# 定义函数
def func(x):return 0.25 * (np.sin(x - np.pi / 2) + 1)# 生成0到pi的10个均匀分布的点
x_values = np.linspace(0, np.pi, 11)[1:][::-1]
y_values = func(x_values) + 1
# print(f"面积{len(y_values)}", y_values)
x_values = np.linspace(0, np.pi, 13)[1:]
weight_inpaint = func(x_values) * 2def draw_heatmap(image, polygons):# 计算函数值并加上1# 搞个和image一样大的二维矩阵inpaint_image_weights = np.zeros(image.shape[:2], dtype=np.float32)for i in range(10):for polygon in polygons:expanded_polygon = expand_polygon_pyclipper(polygon, y_values[i])if expanded_polygon.size > 0:cv2.fillPoly(inpaint_image_weights, [expanded_polygon.astype(np.int32)], weight_inpaint[i])# 收缩0.95区域用白色填充for polygon in polygons:for indx, shk in enumerate([0.99, 0.98]):expanded_polygon = shrink_polygon_pyclipper(polygon, shk)if expanded_polygon.size > 0:cv2.fillPoly(inpaint_image_weights, [expanded_polygon.astype(np.int32)], weight_inpaint[10 + indx])return inpaint_image_weightsdef listPathAllfiles(dirname):result = []for maindir, subdir, file_name_list in os.walk(dirname):for filename in file_name_list:apath = os.path.join(maindir, filename)result.append(apath)return resultdef batch_process(index1, src_image_file, urls):url = urls[index1 % len(urls)]ocr_ret_file = src_image_file.replace(".jpg", ".json")txt_file = src_image_file.replace(".jpg", ".txt")output_image_file = src_image_file.replace(src, save_img_dst_output_image_file)output_image_file_alpha = src_image_file.replace(src, save_img_dst_output_inpaint_alpha)if not os.path.exists(ocr_ret_file):returnif not os.path.exists(txt_file):returnif os.path.exists(output_image_file_alpha):returnoutput_image_file_father = os.path.dirname(output_image_file)os.makedirs(output_image_file_father, exist_ok=True)output_image_file_alpha_father = os.path.dirname(output_image_file_alpha)os.makedirs(output_image_file_alpha_father, exist_ok=True)prompt = open(txt_file, "r", encoding="utf-8").read()if len(prompt) < 7:prompt = "a people"# 造一个mask图片在本地mask_file = "tmp_inpaint_mask.jpg"ocr_json_data = json.load(open(ocr_ret_file, "r", encoding="utf-8"))image = cv2.imread(src_image_file)mask = np.zeros(image.shape, dtype=np.uint8)for item in ocr_json_data:box = item[0]cv2.fillPoly(mask, np.array([box], dtype=np.int32), (255, 255, 255))# cv2.imwrite(mask_file, mask)src_image_file_rb = cv2.imencode('.jpg', image)[1].tobytes()mask_file_rb = cv2.imencode('.jpg', mask)[1].tobytes()# 构建请求的 multipart/form-data 数据files = {'input_image': ('src.jpg', src_image_file_rb, 'image/jpeg'),'input_mask': ('mask.jpg', mask_file_rb, 'image/jpeg')}data = {'prompt': prompt,'negative_prompt': 'big nose, watermark, signature, label, worst quality, low quality, normal quality, lowres, watermark, monochrome, grayscale, ugly, blurry, Tan skin, dark skin, black skin, skin spots, skin blemishes, age spot, glans, disabled, distorted, bad anatomy, morbid, malformation, amputation, bad proportions, twins, missing body, fused body, extra head, poorly drawn face, bad eyes, deformed eye, unclear eyes, cross-eyed, long neck, malformed limbs, extra limbs, extra arms, missing arms, bad tongue, strange fingers, mutated hands, missing hands, poorly drawn hands, extra hands, fused hands, connected hand, bad hands, wrong fingers, missing fingers, extra fingers, 4 fingers, 3 fingers, deformed hands, extra legs, bad legs, many legs, more than two legs, bad feet, wrong feet, extra feets, Negro, black people, black race','sharpness': '10','guidance_scale': '5','outpaint_distance_right': '0','loras': '[{"enabled":true,"model_name":"sd_xl_offset_example-lora_1.0.safetensors","weight":0.1}]','outpaint_distance_left': '0','outpaint_distance_bottom': '0','image_number': '1','negative_prompt': 'bad','refiner_switch': '0.5','base_model_name': 'juggernautXL_v8Rundiffusion.safetensors','image_seed': '-1','style_selections': ['Fooocus V2', 'Fooocus Enhance', 'Fooocus Sharp'],'inpaint_additional_prompt': '','outpaint_selections': '','refiner_model_name': 'None','aspect_ratios_selection': '1024*1024','performance_selection': 'Speed','require_base64': True,'async_process': False,}headers = {'accept': 'application/json'}try:if len(ocr_json_data) > 0:response = requests.post(url, files=files, data=data, headers=headers)postres = response.json()b64 = postres[0]["base64"]# 将base64字符串解码并保存为图像文件imgdata = base64.b64decode(b64)with open(output_image_file, 'wb') as f:f.write(imgdata)# print(f"Output image saved as {output_image_file}")# pillow讲b64直接转为imageimage_inpaint = Image.open(io.BytesIO(imgdata)).convert('RGB')image_inpaint_cv2 = np.array(image_inpaint)image_inpaint_cv2 = cv2.cvtColor(image_inpaint_cv2, cv2.COLOR_RGB2BGR)# 和原图进行alpha混合text_polys = []for item in ocr_json_data:box = item[0]text_polys.append(np.array(box))alpha = draw_heatmap(image, text_polys)inpaint_image_weights = alpha[:, :, np.newaxis]# print(inpaint_image_weights.shape)new_image = image_inpaint_cv2 * inpaint_image_weights + image * (1 - inpaint_image_weights)cv2.imwrite(output_image_file_alpha, new_image)else:# 直接写入cv2.imwrite(output_image_file_alpha, image)except:print(ocr_ret_file)if __name__ == '__main__':src = r"/ssd/xiedong/xiezhenceshi/xiezhen_datasets"save_img_dst_output_image_file = r"/ssd/xiedong/xiezhenceshi/inpaint_output_image_file"save_img_dst_output_inpaint_alpha = r"/ssd/xiedong/xiezhenceshi/inpaint_alpha2"os.makedirs(save_img_dst_output_image_file, exist_ok=True)os.makedirs(save_img_dst_output_inpaint_alpha, exist_ok=True)files = listPathAllfiles(src)files.sort()files = [file for file in files if file.endswith(".jpg")][5304:]tasks = list(enumerate(files))urlname = 'http://10.136.19.26:port/v1/generation/image-inpaint-outpaint'urlsx = []for i in range(7881, 7893):urlsx.append(urlname.replace("port", str(i)))for i in range(8550, 8554):urlsx.append(urlname.replace("port", str(i)))# 去掉7889urlsx.remove('http://10.136.19.26:7889/v1/generation/image-inpaint-outpaint')for i in urlsx:print(i)with Manager() as manager:lock = manager.Lock()with Pool(processes=len(urlsx)) as pool:# 传递 lock 到 process_user_prompt 函数pool.starmap(batch_process,[(index, file, urlsx) for index, file in tasks])# docker run --gpus device=0 -p 7881:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=0 -p 7882:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 7883:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 7884:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 7885:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=2 -p 7886:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=2 -p 7887:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=2 -p 7888:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=3 -p 7889:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=3 -p 7890:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=3 -p 7891:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=3 -p 7892:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=0 -p 8550:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=0 -p 8551:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 8552:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3
# docker run --gpus device=1 -p 8553:7860 -d  kevinchina/deeplearning:fooocusapi-office-v3

相关文章:

【深度学习】fooocusapi,docker,inpainting图像

基础镜像制作来源 fooocusapi接口官方写的&#xff1a; docker run -d --gpusall \-e NVIDIA_DRIVER_CAPABILITIEScompute,utility \-e NVIDIA_VISIBLE_DEVICESall \-p 8888:8888 konieshadow/fooocus-api会下载一些模型&#xff0c;下载完后推这个镜像 docker commit 4dfd1…...

算法017:二分查找

二分查找. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/ 二分查找&#xff0c;其实是双指针的一种特殊情况&#xff0c;但是时间复杂度极低&#…...

谷粒商城实战笔记-37-前端基础-Vue-基本语法插件安装

文章目录 一&#xff0c;v-model1&#xff0c;双向绑定2&#xff0c;vue的双向绑定2.1 html元素上使用指令v-model2.2 model中声明对应属性2.3&#xff0c;验证view绑定modelmodel绑定view 完整代码 二&#xff0c;v-on1&#xff0c;指令简介2&#xff0c;在button按钮中添加v-…...

mybatis中的缓存(一级缓存、二级缓存)

文章目录 前言一、MyBatis 缓存概述二、一级缓存1_初识一级缓存2_一级缓存命中原则1_StatementId相同2_查询参数相同3_分页参数相同4_sql 语句5_环境 3_一级缓存的生命周期1_缓存的产生2_缓存的销毁3_网传的一些谣言 4_一级缓存核心源码5_总结 三、二级缓存1_开启二级缓存2_二级…...

实现自动化采购:食堂采购系统源码开发详解

本篇文章&#xff0c;笔者将详细介绍食堂采购系统的开发过程&#xff0c;从需求分析、系统设计到实现和测试&#xff0c;为您全面解析如何构建一个高效的自动化采购系统。 一、需求分析 1.采购计划管理 2.供应商管理 3.订单管理 4.库存管理 5.财务管理 6.数据分析与报告 …...

linux、windows、macos清空本地DNS缓存

文章目录 Linux&#xff1a;Windows&#xff1a;macOS&#xff1a; Linux&#xff1a; 对于使用systemd的操作系统&#xff08;如CentOS 7、Ubuntu 16.04&#xff09;&#xff0c;可以使用以下命令重启systemd-resolved服务来清除缓存&#xff1a; sudo systemctl restart sys…...

领夹麦克风哪个品牌好,电脑麦克风哪个品牌好,热门麦克风推荐

​在信息快速传播的时代&#xff0c;直播和视频创作成为了表达与交流的重要方式。对于追求卓越声音品质的创作者而言&#xff0c;一款性能卓越的无线麦克风宛如一把利剑。接下来&#xff0c;我要为大家介绍几款备受好评的无线麦克风&#xff0c;这些都是我在实际使用中体验良好…...

【第5章】Spring Cloud之Nacos服务注册和服务发现

文章目录 前言一、提供者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 二、消费者1. 引入依赖2.配置 Nacos Server 地址3. 开启服务注册 三、服务列表四、服务发现1. 获取服务列表2. 测试2.1 获取所有服务2.2 根据服务名获取服务信息 五、更多配置项总结 前言 本节通过…...

Springboot 启动时Bean的创建与注入(一)-面试热点-springboot源码解读-xunznux

Springboot 启动时Bean的创建与注入&#xff0c;以及对应的源码解读 文章目录 Springboot 启动时Bean的创建与注入&#xff0c;以及对应的源码解读构建Web项目流程图&#xff1a;堆栈信息&#xff1a;堆栈信息简介堆栈信息源码详解1、main:10, DemoApplication (com.xun.demo)2…...

单调栈(随缘复习到了,顺手刷了)

也是不知道为什么突然又复习到单调栈了&#xff0c;所以顺手刷了三道题&#xff0c;总结一下 P6503 [COCI2010-2011#3] DIFERENCIJA 思路&#xff1a;这题是要求每个子区间里面的最大值和最小值的差&#xff0c;我们一开始想的必然是纯暴力呀&#xff0c;但是一看这数据&#…...

学习测试10-3自动化 web自动化

web自动化 chrome驱动下载地址&#xff1a; https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/#stable观察Google版本&#xff0c;下相应的驱动 运行代码试试&#xff0c;成功Google就会弹出 from se…...

安防视频监控EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…...

爬虫学习2:爬虫爬取网页的信息与图片的方法

爬虫爬取网页的信息与图片的方法 爬取人物信息 import requestshead {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0" } # 这是get请求带参数的模式…...

MySQL定时备份数据,并上传到oss

1.环境准备 1.安装阿里云的ossutil 2.安装mysql 2.编写脚本 脚本内容如下 #!/bin/bash # 数据库的配置信息&#xff0c;根据自己的情况进行填写 db_hostlocalhost db_usernameroot db_passwordroot db_namedb_root # oss 存贮数据的bucket地址 bucket_namerbsy-backup-buck…...

极速删除 node_modules 仅3 秒()

今天教大家如何快速删除 node_modules 依赖的一个小秘诀&#xff0c;告别繁琐&#xff01;&#xff01;&#xff01; 前言 作为前端开发者&#xff0c;相信大家都曾经历过删除 node_modules 文件夹时的漫长等待。 尤其是在处理那些依赖库繁多的项目时&#xff0c;删除操作…...

vue this.$refs 动态拼接

业务需要&#xff0c;refs是不固定的 <vxe-grid refgridWarehouse v-bind"gridWarehouseOptions" v-if"tableHeight" :height"tableHeight":expand-config"{iconOpen: vxe-icon-square-minus, iconClose: vxe-icon-square-plus}"c…...

一次搞定!中级软件设计师备考通关秘籍

大家好&#xff0c;我是小欧&#xff01; 今天我们来聊聊软考这个话题。要是你准备参加计算机技术与软件专业技术资格&#xff08;软考&#xff09;&#xff0c;那么这篇文章就是为你量身定做的。话不多说&#xff0c;咱们直接进入正题。 什么是软考&#xff1f; 软考&#xf…...

第十六讲 python中的序列-列表简介-特点-常用方法-创建-添加-删除-访问-切片-排序-复制-反转

目录 1. 序列的本质和内存结构 2.列表 2.1 列表简介 2.2 列表的特点 2.3 列表对象的常用方法大全: 2.4 列表的创建 2.4.1 使用方括号 [] 2.4.2 使用 list() 函数 2.4.3 使用 range() 函数 2.4.3.1 range的基本用法 2.4.3.2 返回值 2.4.3.3 range的使用例子 2.4.3.4 range的使…...

大模型日报 2024-07-22

大模型日报 2024-07-22 大模型资讯 谷歌将在ICML 2024展示机器学习研究成果 摘要: 谷歌研究人员将在ICML 2024会议上展示他们在机器学习领域的探索&#xff0c;从理论到应用&#xff0c;构建解决深层问题的ML系统。 代理符号学习&#xff1a;优化AI系统符号组件的框架 摘要: 大…...

Electron 的open-file事件

在 Electron 中,open-file 事件是一个重要的事件,它允许开发者在应用程序已经运行的情况下,通过文件打开请求(如双击文件或在命令行中使用 open 命令打开文件)来捕获文件路径。以下是对 open-file 事件的详细解析: 触发条件 应用已经打开。用户通过双击与应用程序关联的…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...