从零开始搭建Django博客②--Django的服务器内容搭建
本文主要在Ubuntu环境上搭建,为便于研究理解,采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop
系统搭建,当涉及一些文件操作部分便于通过桌面化进行理解,通过Nginx
代理绑定域名,对外发布。
此为从零开始搭建Django博客
系列的第二篇,计划用一周时间完成一个博客搭建并全程记录,便于学习和跟着操作。
从零开始搭建Django博客①–正式开始前的准备工作
从零开始搭建Django博客②–Django的服务器内容搭建
框架理解
我们已经建立了一个基本的名为myblog
的Django项目,他的框架如下:
# 项目文件夹结构
├── manage.py # Django 项目的管理文件
└── myblog # 项目实际存放目录├── asgi.py # 运行在 ASGI 兼容的 Web 服务器上的入口├── __init__.py # 证明该目录此为Python 包。├── settings.py # Django 项目的配置文件├── urls.py # Django 项目的 URL 声明,就像你网站的“目录”。└── wsgi.py # 运行在 WSGI 兼容的Web服务器上的入口
网站构建
在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特定功能模块时,可以将该模块代码整体复制过去,达到复用。因此我们每个WEB应用都是有很多不同的子应用组成,在Django
中,通过APP来创建子应用。
为了实现一个博客,我们需要以下三种功能:
![[Pasted image 20250422111023.png]]
创建APP
在根目录下通过以下代码创建三个app子应用
# 创建文章功能
python manage.py startapp article
# 创建用户功能
python manage.py startapp user
# 创建评论功能
python manage.py startapp comment
此时项目文件夹结构如下,可以发现其中除了我们建立的三个文件夹,又生成了一个db.sqlit3
,这是因为在我们未设置数据库信息时,Django
在settings.py
里默认连接的是项目目录里的该数据库。
![[Pasted image 20250422111427.png]]
连接数据库
为了下一步的数据可视化,我们首先配置数据库信息,打开myblog
文件夹目录下的settings.py
配置数据库信息:
![[Pasted image 20250422114305.png]]
安装pymysql
包(用于连接数据库)和cryptography
包(用于处理密码)
在settings.py
同目录下的__init__.py
中导入mysql
包相关功能
import pymysql
pymysql.install_as_MySQLdb()
![[Pasted image 20250422114611.png]]
重新启动Djangond
服务器,无报错说明配置无误。
注册APP
同样在 myblog
文件夹目录下的settings.py
中,找到INSTALLED_APPS配置项,将新创建的3个app添加到项目的app列表,如下
创建模型
在此之前,我们先理解Django
的MVT
模式
- M全拼为Model,负责和数据库交互,进行数据处理。
- V全拼为View,接收请求,进行业务处理,返回应答。
- T全拼为Template,负责封装构造要返回的html。
文章模型
数据需求分析
首先分析文章功能需要哪些数据
数据名 | 标题 | 作者 | 创建时间 | 更新时间 | 正文 | 浏览量 |
---|---|---|---|---|---|---|
id | title | author | created | updated | body | views |
类型 | 字符串 | 时间 | 时间 | 大量文本 | 数字 | |
备注 | 外键约束 |
构建代码
# 文件:article/modle.py
from django.db import models
# 导入django内建的User模型(后面会提)
from django.contrib.auth.models import User
# timezone 用于处理时间相关事务。
from django.utils import timezone
# 用于反向解析,动态生成链接
from django.urls import reverse# 博客文章数据模型
class ArticlePost(models.Model):# 文章标题。models.CharField 为字符串字段,用于保存较短的字符串,比如标题title = models.CharField(max_length=100)# 文章作者。外键约束,参数 on_delete 用于指定数据删除的方式,链接到(User),只要作者(User)被删除,所有该作者的文章数据都会被删除。author = models.ForeignKey(User, on_delete=models.CASCADE)# 文章创建时间。参数 default=timezone.now 指定其在创建数据时将默认写入当前的时间created = models.DateTimeField(default=timezone.now)# 文章更新时间。参数 auto_now=True 指定每次数据更新时自动写入当前时间updated = models.DateTimeField(auto_now=True)# 文章正文。保存大量文本使用 TextFieldbody = models.TextField()# 文章浏览量total_views = models.PositiveIntegerField(default=0)# 内部类 class Meta 用于给 model 定义元数据(Django内部类)class Meta:# ordering 指定模型返回的数据的排列顺序# '-created' 表明数据应该以倒序排列ordering = ('-created',)# 魔术方法 __str__ 定义当调用对象的 str() 方法时的返回值内容。def __str__(self):# return self.title 将文章标题返回return self.title# 获取文章地址,按照数据库id解析为url:/article/iddef get_absolute_url(self):return reverse('article:article_detail', args=[self.id])
评论模型
数据需求分析
首先分析文章功能需要哪些数据
数据名 | 评论文章 | 评论作者 | 评论时间 | 正文 |
---|---|---|---|---|
id | title | author | created | body |
类型 | 字符串 | 时间 | 大量文本 | |
备注 | 外键约束 |
构建代码
from django.db import models
from django.contrib.auth.models import User
from article.models import ArticlePost# 博文的评论
class Comment(models.Model):
# related_name表示可以反向查询文章和用户的评论article = models.ForeignKey(ArticlePost,on_delete=models.CASCADE,related_name='comments')user = models.ForeignKey(User,on_delete=models.CASCADE,related_name='comments')body = models.TextField()created = models.DateTimeField(auto_now_add=True)# 按照创建时间排序class Meta:ordering = ('created',)def __str__(self):return self.body[:20]
数据迁移
编写好了Model后,接下来就需要进行数据迁移。迁移是Django对模型所做的更改传递到数据库中的方式。
注意,每当对数据库进行了更改(添加、修改、删除等)操作,都需要进行数据迁移。
Django的迁移代码是由模型文件自动生成的,它本质上只是个历史记录,Django可以用它来进行数据库的滚动更新,通过这种方式使其能够和当前的模型匹配。
在命令行中输入命令让 Django知道我们自定义模型有一些变更,并根据我们自定义app的模型生成创建数据表的脚本:
python manage.py makemigrations
python manage.py migrate
数据查看
可以通过查看数据库检查数据迁移效果
mysql -u 数据库用户名 -p
输入密码后进入数据库
# 切换到数据库
USE 数据库名;
# 显示数据表
SHOW TABLES;
可以看到数据库中已经有了Django
自带的用户数据表和我们创建的文章、评论数据表
创建视图
再看下MVT图:
我们已经构建起Model与数据库之间的联系,下面需要构建模型(Model)与视图(View)之间的关系。
Django 中视图的概念是「一类具有相同功能和模板的网页的集合」。
每一个视图表现为一个简单的Python函数,它需要要做的只有两件事:返回一个包含被请求页面内容的 HttpResponse
对象,或者抛出一个异常,比如 Http404
。
视图函数中的request与网页发来的请求有关,里面包含get或post的内容、用户浏览器、系统等信息。简单来说,视图就是实现将用户的想法通过WEB传递到模型。
根据系统设计过程中需要的功能,我们分别在不同的app 中创建对应的View视图。
文章视图
对于文章,我们需要有以下功能:
- 文章创建(article_create)
- 实现文章的创建和提交功能。
- 文章内容显示(article_detail)
- 展示文章的标题和内容详情,同时在此视图中取出评论,并展示所有评论列表。
- 文章删除(article_delete)
- 实现文章删除功能。
- 文章修改(article_update)
- 实现文章的修改功能。
- 文章排序(article_list)
- 实现默认按发布日期排序。
- 实现可按浏览量(热度)排序。
- 利用Django 的
paginator
组件实现分页功能。
# 导入Django内部的登录装饰器,可以确保只有登录才能访问相应视图。
from django.contrib.auth.decorators import login_required
# 导入http功能
from django.http import HttpResponse
# 导入render功能和redirect功能
from django.shortcuts import render,redirect
# 导入数据模型ArticlePost
from comment.models import Comment
# 从本目录导入模型
from . import models
# 从本目录的模型中导入文章功能
from .models import ArticlePost
# 引入内置User模型
from django.contrib.auth.models import User
# 引入内置的分页模块
from django.core.paginator import Paginator# 定义文章创建函数
def article_create(request):# 如果用户提交数据,则把相应数据填入变量中if request.method == 'POST':new_article_title = request.POST.get('title')new_article_body = request.POST.get('body')# 默认第一个用户作者new_article_author = User.objects.get(id=1)# 生成一个文章对象,即创建模型。models.ArticlePost.objects.create(title=new_article_title, body=new_article_body,author=new_article_author)return redirect("article:article_list")# 如果用户请求获取数据,则给用户提供一个写文章的界面else:return render(request, 'article/create.html')# 一般都是先请求获取数据--生成写文章界面--写完后再提交数据# 文章详情
def article_detail(request, id):# 取出相应的文章article = ArticlePost.objects.get(id=id)# 浏览量 +1article.total_views += 1# 把新的浏览量字段保存数据库article.save(update_fields=['total_views'])# 取出文章评论comments = Comment.objects.filter(article=id)# 需要传递给模板的对象# context = { 'article': article }context = { 'article': article, 'comments': comments }# 载入模板,并返回context对象return render(request, 'article/detail.html', context)# 删文章
def article_delete(request, id):# 根据 id 获取需要删除的文章article = ArticlePost.objects.get(id=id)# 调用.delete()方法删除文章article.delete()# 完成删除后返回文章列表return redirect("article:article_list")# 更新文章
# 提醒用户登录
@login_required(login_url='/userprofile/login/')
def article_update(request, id):# # 获取需要修改的具体文章对象article = ArticlePost.objects.get(id=id)# 过滤非作者的用户if request.user != article.author:return HttpResponse("抱歉,你无权修改这篇文章。")# 判断用户是否为 POST 提交表单数据if request.method == "POST":new_article_title = request.POST.get('title')new_article_body = request.POST.get('body')article.title = new_article_titlearticle.body = new_article_bodyarticle.save()# 完成后返回到修改后的文章中。需传入文章的 id 值return redirect("article:article_detail", id=id)else:# 赋值上下文,将 article 文章对象也传递进去,以便提取旧的内容context = {'article': article}return render(request, 'article/update.html', context)def article_list(request):# 根据GET请求中查询条件# 如果选择按浏览量排序返回数组if request.GET.get('order') == 'total_views':article_list = ArticlePost.objects.all().order_by('-total_views')order = 'total_views'# 否则按照默认排序返回数组else:article_list = ArticlePost.objects.all()order = 'normal'# 分页,每页4项paginator = Paginator(article_list, 4)# 如果选择了页面page = request.GET.get('page')# 查看该页的文章articles = paginator.get_page(page)# 返回这些文章模型,并按排序返回context = { 'articles': articles, 'order': order }return render(request, 'article/list.html', context)
评论视图
在文件comment/views.py文件中创建如下视图函数,评论比较简单,暂时只创建一个添加评论的就可以了:
# 导入相关模块
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from article.models import ArticlePost
from . import models# 文章评论
@login_required(login_url='/user/login/')
def post_comment(request, article_id):article = get_object_or_404(ArticlePost, id=article_id)if request.method == 'POST':new_comment_body = request.POST.get('body')new_article_user = request.usermodels.Comment.objects.create(article=article, body=new_comment_body,user=new_article_user)return redirect(article)else:return HttpResponse("发表评论仅接受POST请求。")
用户视图
之所以没创建用户模型是因为
Django
内置了用户模型,我们在开发一些用户权限控制不复杂的网站或者系统时,可以直接采用Django自带的用户认证模块功能,通过视图调用即可。
用户注册登录
用户注册、登录一般都会用到表单,Django
中也内置了一个表单组件,首先我们利用该组件构建表单,在user的app中新建forms.py
# 引入表单类
from django import forms
# 引入 User 模型
from django.contrib.auth.models import User# 登录表单,继承了 forms.Form 类
class UserLoginForm(forms.Form):username = forms.CharField()password = forms.CharField()# 注册用户表单
class UserRegisterForm(forms.ModelForm):# 复写 User 的密码password = forms.CharField()password2 = forms.CharField()class Meta:model = Userfields = ('username', 'email')# 对两次输入的密码是否一致进行检查def clean_password2(self):data = self.cleaned_dataif data.get('password') == data.get('password2'):return data.get('password')else:raise forms.ValidationError("密码输入不一致,请重试。")
以上是一个简单的登录、注册表单实现
视图建设
用户视图需要三个功能,登录(验证账号密码)、退出、注册(新建一条用户数据),代码如下:
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login,logout
from django.http import HttpResponse
from .forms import UserLoginForm,UserRegisterForm# Create your views here.
def user_login(request):if request.method == 'POST':user_login_form = UserLoginForm(data=request.POST)if user_login_form.is_valid():# .cleaned_data 清洗出合法数据data = user_login_form.cleaned_data# 检验账号、密码是否正确匹配数据库中的某个用户# 如果均匹配则返回这个 user 对象user = authenticate(username=data['username'], password=data['password'])if user:# 将用户数据保存在 session 中,即实现了登录动作login(request, user)return redirect("article:article_list")else:return HttpResponse("账号或密码输入有误。请重新输入~")else:return HttpResponse("账号或密码输入不合法")elif request.method == 'GET':user_login_form = UserLoginForm()context = { 'form': user_login_form }return render(request, 'userprofile/login.html', context)else:return HttpResponse("请使用GET或POST请求数据")def user_logout(request):logout(request)return redirect("article:article_list")# 用户注册
def user_register(request):if request.method == 'POST':user_register_form = UserRegisterForm(data=request.POST)if user_register_form.is_valid():new_user = user_register_form.save(commit=False)# 设置密码new_user.set_password(user_register_form.cleaned_data['password'])new_user.save()# 保存好数据后立即登录并返回博客列表页面login(request, new_user)return redirect("article:article_list")else:return HttpResponse("注册表单输入有误。请重新输入~")elif request.method == 'GET':user_register_form = UserRegisterForm()context = { 'form': user_register_form }return render(request, 'userprofile/register.html', context)else:return HttpResponse("请使用GET或POST请求数据")
配置路由
定义完视图后,我们需要通过路由访问这些视图:
查找视图的过程 :
- 1.请求者在浏览器地址栏中输入URL, 请求到网站.
- 2.网站获取URL信息.
- 3.然后与编写好的URLconf逐条匹配.
- 4.如果匹配成功则调用对应的视图.
- 5.如果所有的URLconf都没有匹配成功.则返回404错误.
我们有3个app,Django可以对URL进行分级管理,我们在每个app文件夹内的urls.py分别定义各自app相关的URL,然后在根目录DjangoBlog的urls.py中通过include指令来包含各个app中的URL。
- 需要两步完成
URLconf
配置- 1.在
项目
中定义URLconf
(到应用) - 2.在
应用
中定义URLconf
(应用内)
- 1.在
项目中定义路由(根目录的urls.py)
# 引入用户管理后台
from django.contrib import admin
# 记得引入include
from django.urls import path, include
# 需要使用文章视图显示文章列表作为首页
from article import viewsurlpatterns = [path('admin/', admin.site.urls),path('', views.article_list, name='home'),path('article/', include('article.urls', namespace='article')),path('user/', include('user.urls', namespace='user')),path('comment/', include('comment.urls', namespace='comment')),
]
应用中定义路由
文章APP(urls.py)
# 引入path
from django.urls import path
# 引入views.py
from . import views# 正在部署的应用的名称
app_name = 'article'urlpatterns = [path('', views.article_list),# path函数将url映射到视图path('article-list/', views.article_list, name='article_list'),# 文章详情path('article-detail/<int:id>/', views.article_detail, name='article_detail'),# 写文章path('article-create/', views.article_create, name='article_create'),# 删除文章path('article-delete/<int:id>/', views.article_delete, name='article_delete'),# 更新文章path('article-update/<int:id>/', views.article_update, name='article_update'),
]
评论APP(urls.py)
# 引入path
from django.urls import path
# 引入views.py
from . import views# 正在部署的应用的名称
app_name = 'comment'urlpatterns = [# # path函数将url映射到视图# 发表评论path('post-comment/<int:article_id>/', views.post_comment, name='post_comment'),
]
用户APP(urls.py)
from django.urls import path
from . import viewsapp_name = 'user'urlpatterns = [# 用户登录path('login/', views.user_login, name='login'),# 用户退出path('logout/', views.user_logout, name='logout'),# 用户注册path('register/', views.user_register, name='register'),]
至此,所有后端工作准备完毕,下面我们建一个前端模板用于显示相关信息:
创建模板
在根目录新建一个templates
文件夹,用于存放模板文件。
配置主要目录下的setting.py
中的TEMPLATES,绑定当前创建的templates
文件夹地址。
前期我们已经在视图中设置了视图传入数据的目标地址,以文章视图为例
我们有如下路由和创建文章功能
当得到GET请求页面127.0.0.1:8000/article/article-create/
时,会调取article_create
函数返回 article/create.html
页面.
我们直接用html语言简单建立该页面测试一下:
<!DOCTYPE html>
<html>
<head>
<title>只是测试</title>
</head>
<body>
<div class="container"><div class="row"><div class="col-12"><br><!-- 提交文章的表单 --><form method="post" action="."><!-- Django中需要POST数据的地方都必须有csrf_token -->{% csrf_token %}<!-- 文章标题 --><div class="form-group"><!-- 标签 --><label for="title">文章标题</label><!-- 文本框 --><input type="text" class="form-control" id="title" name="title"></div><!-- 文章正文 --><div class="form-group"><label for="body">文章正文</label><!-- 文本区域 --><textarea type="text" class="form-control" id="body" name="body" rows="12"></textarea></div><!-- 提交按钮,表单提交会直接POST --><button type="submit" class="btn btn-primary">完成</button></form></div></div>
</div>
</body>
</html>
访问127.0.0.1:8000/article/article-create/
,得到如下页面:
到此,我们已经完成了所有应用模型、视图的搭建,并初步构建了一个文件创建的页面进行验证,下一步我们将针对每一个视图建设模板,完成视图与模板之间的连接。
相关文章:
从零开始搭建Django博客②--Django的服务器内容搭建
本文主要在Ubuntu环境上搭建,为便于研究理解,采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop系统搭建,当涉及一些文件操作部分便于通过桌面化进行理解,通过Nginx代理绑定域名,对外发布。 此为从零开始搭建Django博客…...
如何用python脚本读取本地excel表格Workbook.xlsx将里面B2:B8内容,发给本地ollama大模型改写内容后写入对应C2:C8?
环境: python3.10 Win10专业版 ollama 火山引擎 影刀 问题描述: 如何用python脚本读取本地excel表格Workbook.xlsx将里面B2:B8内容,发给本地ollama大模型改写内容后写入对应C2:C8? 解决方案: 1.制作一个python脚本如下: import openpyxl import requests import…...
webpack详细打包配置,包含性能优化、资源处理...
以下是一个详细的 Webpack 5 配置示例,包含常见资源处理和性能优化方案: const path require(path); const webpack require(webpack); const { BundleAnalyzerPlugin } require(webpack-bundle-analyzer); const TerserPlugin require(terser-webp…...
MYSQL的binlog
用于备份恢复和主从复制 binlog 有 3 种格式类型,分别是 STATEMENT(默认格式)、ROW、 MIXED: STATEMENT:每一条修改数据的 SQL 都会被记录到 binlog 中(相当于记录了逻辑操作,所以针对这种格式…...
Saliency Driven Perceptual Image Compression阅读
2021 WACV 创新点 常用的评估指标如MS-SSIM和PSNR不足以判断压缩技术的性能,它们与人类对相似性的感知不一致(2和3的MS-SSIM更高,但文字反而没那么清晰)。 考虑显著区域的压缩(a)将更多的比特分配给显著区域(b&#…...
【C++ 类和数据抽象】构造函数
目录 一、构造函数的基本概念 1.1 构造函数核心特性 1.2 构造函数的作用 1.3 构造函数类型体系 二、构造函数的类型 2.1 默认构造函数 2.2 带参数的构造函数 2.3 拷贝构造函数 2.4 移动构造函数(C11 及以后) 三、初始化关键技术 3.1 成员初始…...
kotlin的kmp编程中遇到Unresolved reference ‘java‘问题
解决办法 打开 File → Project Structure → Project 确保 Project SDK 是 与你的 jvmToolchain 保持一致 如果没有,点击右上角 Add SDK 添加 JDK 路径 同步Sync 然后就正常了。 package org.example.projectimport androidx.compose.animation.AnimatedVi…...
鸿蒙Flutter仓库停止更新?
停止更新 熟悉 Flutter 鸿蒙开发的小伙伴应该知道,Flutter 3.7.12 鸿蒙化 SDK 已经在开源鸿蒙社区发布快一年了, Flutter 3.22.x 的鸿蒙化适配一直由鸿蒙突击队仓库提供,最近有小伙伴反馈已经 2 个多月没有停止更新了,不少人以为停…...
【Ultralytics 使用yolo12 读取tiff 数据异常解决】
Ultralytics 使用yolo12 读取tiff 数据解决 Ultralytics 使用yolo12 读取tiff 数据异常解决 Ultralytics 使用yolo12 读取tiff 数据异常解决 Lib\site-packages\ultralytics\utils\patches.py def imread(filename: str, flags: int cv2.IMREAD_COLOR):"""Read…...
画布交互系统深度优化:从动态缩放、小地图到拖拽同步的全链路实现方案
画布交互系统深度优化:从动态缩放、小地图到拖拽同步的全链路实现方案 在可视化画布系统开发中,高效的交互体验与稳定的性能表现是核心挑战。本文针对复杂场景下的五大核心需求,提供完整的技术实现方案,涵盖鼠标中心缩放、节点尺寸…...
GTS-400 系列运动控制器板(七)----修改限位开关触发电平
运动控制器函数库的使用 运动控制器驱动程序、dll 文件、例程、Demo 等相关文件请通过固高科技官网下载,网 址为:www.googoltech.com.cn/pro_view-3.html 1 Windows 系统下动态链接库的使用 在 Windows 系统下使用运动控制器,首先要安装驱动程序。在安装前需要提前下载…...
学习前端(前端技术更新较快,需持续关注技术更新)
目录 1. 基础三件套 1.1 HTML 1.2 CSS 1.3 JavaScript 2. 前端框架 2.1 React 2.2 Vue 2.3 Angular 3. 工程化工具 3.1 构建工具 3.2 代码质量 4. 网络和安全 4.1 HTTP/HTTPS 4.2 性能优化 5. 前沿技术 5.1 TypeScript 5.2 WebAssembly 5.3 微前端 5.4 可视…...
视频转换为MP4格式,小白工具批量转换,在线操作,简单快捷,超实用
小白工具https://www.xiaobaitool.net/videos/convert-to-mp4/ 是一款适合在线将视频转换为MP4格式的工具,尤其适合希望快速转换且无需下载安装软件的用户。以下是对该工具的详细推荐及使用建议: 一、工具特点 在线操作,无需下载 用户只需通…...
PDF处理控件Aspose.PDF指南:使用 Python 将 EPUB 转换为 PDF
EPUB是一种流行的电子书格式,用于可重排内容,而PDF则广泛用于固定版式文档,非常适合共享和打印。如果您想使用 Python 将 EPUB 转换为 PDF,Aspose.PDF for Python 提供了一个简单可靠的解决方案。在本教程中,我们将向您…...
超级扩音器手机版:随时随地,大声说话
在日常生活中,我们常常会遇到手机音量太小的问题,尤其是在嘈杂的环境中,如KTV、派对或户外活动时,手机自带的音量往往难以满足需求。今天,我们要介绍的 超级扩音器手机版,就是这样一款由上海聚告德业文化发…...
Jenkins的地位和作用
所处位置 Jenkins 是一款开源的自动化服务器,广泛应用于软件开发和测试流程中,主要用于实现持续集成(CI)和持续部署(CD)。它在开发和测试中的位置和作用可以从以下几个方面来理解: 1. 在开发和测…...
NumPy进阶:广播机制、高级索引与通用函数详解
目录 一、广播机制:不同形状数组间的运算 1. 概念 2. 广播规则 3. 实例 二、高级索引:布尔索引与花式索引 1. 布尔索引 (1)创建布尔索引 (2)布尔索引的应用 2. 花式索引 (1࿰…...
Trino分布式 SQL 查询引擎
Trino(以前称为 PrestoSQL)是一个开源的分布式 SQL 查询引擎,专为交互式分析查询设计,可对大规模数据集进行快速查询。以下从多个方面详细介绍 Trino: 主要特点 多数据源支持:Trino 能够连接多种不同类型…...
Oracle DBA 高效运维指南:高频实用 SQL 大全
大家好,这里是 DBA学习之路,专注于提升数据库运维效率。 目录 前言Top SQL表空间使用率RMAN 备份DataGuard等待事件行级锁在线日志切换用户信息ASM 磁盘组DBLink数据文件收缩AWR 写在最后 前言 作为一名 Oracle DBA,在日常数据库运维工作中&…...
SpringBoot原生实现分布式MapReduce计算
一、架构设计调整 核心组件替换方案: 1、注册中心 → 数据库注册表 2、任务队列 → 数据库任务表 3、分布式锁 → 数据库行级锁 4、节点通信 → HTTP REST接口 二、数据库表结构设计 节点注册表 CREATETABLE compute_nodes (node_id VARCHAR(36)PRIMARYKEY,last_…...
可吸收聚合物:医疗科技与绿色未来的交汇点
可吸收聚合物(Biodegradable Polymers)作为生物医学工程的核心材料,正引领一场从“金属/塑料植入物”到“智能降解材料”的范式转移。根据QYResearch(恒州博智)预测,2031年全球可吸收聚合物市场销售额将突破…...
Java从入门到“放弃”(精通)之旅——抽象类和接口⑨
Java从入门到“放弃”(精通)之旅🚀——抽象类和接口⑨ 引言 在Java面向对象编程中,抽象类和接口是两个非常重要的概念。它们为代码提供了更高层次的抽象能力,是设计灵活、可扩展系统的关键工具。 🟦一、抽…...
游戏引擎学习第239天:通过 OpenGL 渲染游戏
回顾并为今天的内容做准备 今天,我想继续完成这部分内容,因为实际上我们已经完成了大部分工作,剩下的部分并不复杂。我计划今天完成这部分实现,至少是那些不涉及纹理的部分。正如昨天所说,纹理部分才是唯一比较复杂的…...
基于Python的多光谱遥感数据处理与分类技术实践—以农作物分类与NDVI评估为例
多光谱遥感数据包含可见光至红外波段的光谱信息,Python凭借其丰富的科学计算库(如rasterio、scikit-learn、GDAL),已成为处理此类数据的核心工具。本文以Landsat-8数据为例,演示辐射校正→特征提取→监督分类→精度评…...
数字空间与VR有什么关系?什么是数字空间?
数字空间与VR的关系 数字空间与虚拟现实(VR)之间存在着紧密而复杂的关系,它们相互影响、共同促进发展。为了深入理解这一关系,我们需要明确数字空间的基本概念及其与VR技术的相互作用。 数字空间的概念 数字空间,通常…...
navicat导入sql文件 所有问题解决方法集合
问题一:mysql导入大批量数据出现MySQL server has gone away的解决方法 方法一: 查看mysql max_allowed_packet的值 show global variables like max_allowed_packet;可以看到是64M(67108864/1024/1024) 调整为所需大小 例如我们需要调整为1024M(102…...
3、有Bluetooth,LCD,USB,SD卡,PSRAM,FLASH、TP等软硬件驱动开发经验优先考虑
首先,Bluetooth驱动开发经验。蓝牙是一种无线通信技术,广泛应用于设备之间的数据传输,比如耳机、键盘、智能家居设备等。驱动开发可能涉及底层协议的实现、与硬件的交互,以及确保兼容性和稳定性。需要了解蓝牙协议栈,如…...
【k8s】PV,PVC的回收策略——return、recycle、delete
PV 和 PVC 的回收策略主要用于管理存储资源的生命周期,特别是当 PVC 被删除时,PV 的处理方式。回收策略决定了 PV 在 PVC 被删除后的行为。 回收策略的类型 Kubernetes 提供了三种主要的回收策略,用于管理 PV 的生命周期: Reta…...
K8S探针的应用
目录: 1、探针的简介2、启用探针2.1、启用就绪探针2.2、启用存活探针2.3、启用启动探针(可选) 1、探针的简介 在Kubernetes中,探针(Probes)是用来检查容器健康状况的工具,它们帮助Kubernetes了…...
c++STL——stack、queue、priority_queue的模拟实现
文章目录 stack、queue、priority_queue的模拟实现使用部分模拟实现容器适配器deque的介绍原理真实结构deque的迭代器deque的操作deque的优缺点 stack的模拟实现按需实例化queue的模拟实现priority_queue的模拟实现为何引入仿函数代码实现 stack、queue、priority_queue的模拟实…...
【Redis】字符串类型List 常用命令详解
文章目录 1. 添加1.1 lpush - 从左或Rpush - 从右添加元素1.2 linsert - 插入新值到某个值前后 2. 获取2.1 lrange - 根据区间获取值2.2 lindex - 根据下标获取值2.3 llen - 获取列表的长度 3. 删除3.1 lpop - 移除最左或rpop - 最右的元素3.2 lrem - 移除指定的值3.3 rpoplpus…...
.NET仓储层在 using 块中创建 SqlSugarClient 的风险
如题,先看代码示例 using 块的使用 public ISugarQueryable<T> GetSet(Expression<Func<T, bool>> whereExpression null) {using (SqlSugarClient dbClient SqlSugarInstance.GetInstance()){var query dbClient.Queryable<T>();if (w…...
PowerQuery逆透视将二维表转换为一维表
PowerQuery逆透视将二维表转换为一维表 原因:为什么要转成一维表? 实例: 1.例如如果用二维表做占比图,我们需要将所有的指标列添加到值上,如图: 2.如果用一维表,我们只需要添加一个指标列和一…...
谐振模态图
t0时刻,原边Q6、Q7导通副边Q1、Q4导通 T1时刻,原边谐振回路电流,由负变正,过零点,副边绕组电流小于负载电流,输出电容放电 T2时刻,副边绕组电流等于负载电流,输出电容不充不放 T3时…...
Idea 配置 Git
1、下载Git 下载地址: Git - Downloading Package 2、win 打开 git bash ,配置邮箱和用户名 //配置邮箱 git config --global user.email "710419844qq.com" //配置全局用户名 git config --global user.name "smelodys" 3、ide…...
B + 树与 B 树的深度剖析
在数据库领域,B 树和 B 树是两种极为关键的数据结构,它们对于数据的存储、查询以及索引的构建等方面都有着深远的影响。深刻理解这两种树的原理、特性以及它们之间的差异,对于数据库的性能优化、数据组织和管理等工作具有不可替代的重要作用…...
MongoDB索引
一、索引核心价值 MongoDB索引通过构建高效查询路径,从根本上改变数据检索方式。当未建立索引时,数据库引擎被迫执行全集合扫描(COLLSCAN),如同在无序的书架上逐本查找目标书籍。通过建立索引,查询复杂度从…...
Docker--Docker网络原理
虚拟网卡 虚拟网卡(Virtual Network Interface,简称vNIC) 是一种在软件层面模拟的网卡设备,不依赖于物理硬件,而是通过操作系统或虚拟化技术实现网络通信功能。它允许计算机在虚拟环境中模拟物理网卡的行为࿰…...
Java 性能优化:如何在资源受限的环境下实现高效运行?
Java 性能优化:如何在资源受限的环境下实现高效运行? 在计算机系统中,性能优化是一项至关重要的任务,尤其是在资源受限的环境下,如何让 Java 程序高效运行是许多开发者面临的挑战。本文将深入探讨 Java 性能优化的策略…...
Spring之我见 - Spring MVC重要组件和基本流程
核心组件详解 前端控制器 - DispatcherServlet 作用:所有请求的入口,负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…...
MongoDB常用命令
数据库操作 显示所有数据库 show dbs 切换/创建数据库 (如果数据库不存在则创建) use <database_name> 删除当前数据库 db.dropDatabase() 查看当前数据库 db 查看数据库状态 db.stats() 集合操作 显示当前数据库中的所有集合 show collections 创建集合 d…...
Java Set/List 知识点 Java面试 基础面试题
Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复,允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…...
C#委托介绍
委托可以将方法作为参数传递,同时委托也可以自己作为参数传递 委托可分为自定义委托delegate 无返回值的Action 与有返回值的Func委托 也有匿名委托与Lamada 委托支持多播是事件的基础 用处如在分线程调用主线程的UI invoke public delegate string Say(stri…...
三网通电玩城平台系统结构与源码工程详解(三):控制台与银商权限模块设计
本篇聚焦于三网通电玩城系统中的控制台管理系统及银商权限逻辑。通过深入解构后台系统的角色分权、账目明细管理、发卡接口与日志追踪机制,本文将提供完整的权限划分方案和部分关键实现代码,为平台运维与数据安全提供坚实基础。 一、控制台整体结构概览 …...
audio 核心服务AudioPolicyService 和AudioFlinger启动流程
目录 1、audioserver启动 2、AudioPolicyService启动 3、AudioFlinger启动 audio的核心服务有两个,AudioPolicyService 和AudioFlinger他们到在audioserver一个进程中 1、audioserver启动 设备开机,系统启动时将执行 /system/etc/init/audioserver.rc…...
Android自动化功能-使用Appium获取android页面节点元素信息
一、appium安装和使用 官方网站:https://appium.io/docs/en/latest/ github地址:https://github.com/appium/appium 安装步骤: 首先需要安装node.js 安装好node.js之后使用npm安装 appium npm install -g appium appium -v # 检查安装版本…...
springboot项目配置springMVC
为什么需要配置springMVC 在Spring Boot中配置Spring MVC,实际上是为了更好地集成和使用Spring框架提供的Web开发功能。 Spring Boot本身是为了简化Spring应用的配置和部署,它内置了一些默认的配置和组件,帮助开发者快速启动应用,…...
解决 MongoDB 查询中的 `InvalidMongoDbApiUsageException` 错误
您在使用 Spring Data MongoDB 时遇到了 InvalidMongoDbApiUsageException 异常,错误信息如下: “由于 com.mongodb.BasicDocument 的限制,您无法添加第二个 ‘null’ 条件。查询已经包含 ‘{ “KaTeX parse error: Expected }, got EOF at e…...
多模态知识图谱:重构大模型RAG效能新边界
当前企业级RAG(Retrieval-Augmented Generation)系统在非结构化数据处理中面临四大核心问题: 数据孤岛效应:异构数据源(文档/表格/图像/视频)独立存储,缺乏跨模态语义关联,导致知识检…...
基于大模型的贲门失弛缓症手术全流程风险预测与治疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与技术路线 二、贲门失弛缓症概述 2.1 定义与发病机制 2.2 临床表现与诊断标准 2.3 治疗现状与挑战 三、大模型预测原理与数据基础 3.1 大模型介绍与选择依据 3.2 数据收集与预处理 3.3 模型训…...