从零开始搭建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博客…...
【读论文】HM-RAG:分层多智能体多模态检索增强生成
如何在多模态信息检索和生成中,通过协作式多智能体系统来处理复杂的多模态查询。传统的单代理RAG系统在处理需要跨异构数据生态系统进行协调推理的复杂查询时存在根本性限制:处理多种查询类型、数据格式异质性和检索任务目标的多样性;在视觉内容和文本内…...
mysql日常巡检
1.查看mysql服务是否异常 systemctl status mysql_3306 查看MySQL进程是否存在 ps -ef | grep mysql 2.连接异常检查 (1)查看是否异常连接 show processlist; #或 show full processlist; (2)查看当前失败连接数 show global status like aborted_connects; (3)查看试…...
【Git】branch合并分支
在 Git 中,将分支合并到 main 分支是一个常见的操作。以下是详细的步骤和说明,帮助你完成这个过程。 1. 确保你在正确的分支上 首先,你需要确保当前所在的分支是 main 分支(或者你要合并到的目标分支)。 检查当前分支…...
文件操作和IO(上)
绝对路径和相对路径 文件按照层级结构进行组织(类似于数据结构中的树型结构),将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式,一种是绝对路径,另一种是相对路径。 绝对路径…...
7.6 GitHub Sentinel后端API实战:FastAPI高效集成与性能优化全解析
GitHub Sentinel Agent 用户界面设计与实现:后端 API 集成 关键词:前后端分离架构、RESTful API 设计、数据序列化、命令行工具开发、集成测试 后端 API 集成关键技术实现 本阶段需要完成前端界面与后端服务的无缝对接,实现以下核心功能: #mermaid-svg-FFnzT13beWV52dtx …...
JavaFX深度实践:从零构建高级打地鼠游戏(含多物品与反馈机制)
大家好!经典的“打地鼠”游戏是许多人童年的回忆,也是学习 GUI 编程一个非常好的切入点。但仅仅是“地鼠出来就打”未免有些单调。今天,我们来点不一样的——用 JavaFX 打造一个高级版的打地鼠游戏!在这个版本中,洞里钻…...
Python 简介与入门
目录 一、Python 初识 1、Python 的优势 2、Python 的特性 3、Python 的应用领域 二、Linux 环境中安装 Python 1、下载 Python3.11.6 2、安装依赖包 3、解压 Python 压缩包 4、安装 Python 5、编译及安装 6、建立软链接 7、测试 Python3 运行 8、设置国内 pip 更…...
理解RAG第六部分:有效的检索优化
在RAG系统中,识别相关上下文的检索器组件的性能与语言模型在生成有效响应方面的性能同样重要,甚至更为重要。因此,一些改进RAG系统的努力将重点放在优化检索过程上。 从检索方面提高RAG系统性能的一些常见方法。通过实施高级检索技术&#x…...
实训Day-2 流量分析与安全杂项
目录 实训Day-2-1流量分析实战 实训目的 实训任务1 SYN半链接攻击流量分析 实训任务2 SQL注入攻击流量分析一 实训任务3 SQL注入攻击流量分析二 实训任务4 Web入侵溯源一 实训任务5 Web入侵溯源二 编辑 实训Day-2-1安全杂项实战 实训目的 实训任务1 流量分析 FTP…...
几种电气绝缘类型
1. 基本绝缘 1.1 绝缘等级 1.2 I类设备 2. 附加绝缘 3. 双重绝缘 4. 加强绝缘 5. 功能性绝缘 1. 基本绝缘 用于防止触及带电部件的初级保护,该防护是由绝缘材料完成的 基本绝缘的目的在于为防电击提供一个基本的保护,以避免触电的危险,不过此类绝缘只能保证正常状态下…...
char32_t、char16_t、wchar_t 用于 c++ 语言里存储 unicode 编码的字符,给出它们的具体定义
(1) #include <iostream> #include <string>int main() { std::u16string s u"C11 引入 char16_t"; // 定义 UTF-16 字符串for (char16_t c : s) // 遍历输出每个 char16_t 的值std::cout << std::hex << (…...
Java Set/List 知识点 Java面试 基础面试题
Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复,允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…...
Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记
本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。 白皮书版本为March 2025, Version 3.3,副标题为:Optimizing Oracle Database resou…...
FastAPI WebSocket 聊天应用详细教程
项目简介 这是一个基于 FastAPI 和 WebSocket 实现的实时聊天应用,支持一对一聊天、离线消息存储等功能。 技术栈 后端:FastAPI (Python)前端:HTML、JavaScript、CSS通信:WebSocket认证:简单的 token 认证 项目结构…...
(区间 dp)洛谷 P6879 JOI2020 Collecting Stamps 3 题解
题意 给定一个周长为 L L L 的圆,从一个点出发,有 N N N 个黑白熊雕像,编号为 1 1 1 到 N N N,第 i i i 个雕像在顺时针 X i X_i Xi 米处,如果你没有在 T i T_i Ti 秒内收集到这个黑白熊雕像,那…...
vue3+canvas裁剪框样式【前端】
目录 canvas绘制裁剪框:拖拽改变框的大小:圆圈样式:方块样式: canvas绘制裁剪框: // 绘制裁剪框 const drawCropRect (ctx: CanvasRenderingContext2D): void > {if (cropRect.value.width > 0 && crop…...
【Vue3 / TypeScript】 项目兼容低版本浏览器的全面指南
在当今前端开发领域,Vue3 和 TypeScript 已成为主流技术栈。然而,随着 JavaScript 语言的快速演进,许多现代特性在低版本浏览器中无法运行。本文将详细介绍如何使 Vue3 TypeScript 项目完美兼容 IE11 等低版本浏览器。 一、理解兼容性挑战 …...
软件功能测试和非功能测试有什么区别和联系?
软件测试是保障软件质量的核心环节,而软件功能测试和非功能测试作为测试领域的两大重要组成部分,承担着不同但又相互关联的职责。 软件功能测试指的是通过验证软件系统的各项功能是否按照需求规格说明书来正确实现,确保软件的功能和业务流程…...
10_C++入门案例习题: 结构体案例
案例描述 学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下 设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数, 创建…...
快速定位达梦缓存的执行计划并清理
开发告诉你一个sql慢,你想看看缓存中执行计划时,怎么精准快速定位? 可能一般人通过文本内容模糊搜索 select cache_item, substr(sqlstr,1,60)stmt from v$cachepln where sqlstr like %YOUR SQL STRING%; 搜出来的内容比较多,研…...
Spring中配置 Bean 的两种方式:XML 配置 和 Java 配置类
在 Spring 框架中,配置 Bean 的方式主要有两种:XML 配置 和 Java 配置类。这两种方式都可以实现将对象注册到 Spring 容器中,并通过依赖注入进行管理。本文将详细介绍这两种配置方式的步骤,并提供相应的代码示例。 1. 使用 XML 配置的方式 步骤 创建 Spring 配置文件 创建…...
AI算子开发是什么
AI算子开发是指为人工智能(尤其是深度学习)模型中的基础计算单元(如卷积、矩阵乘法、激活函数等)设计并优化其底层实现的过程。这些计算单元被称为“算子”(Operator),它们是构建神经网络的核心…...
低光环境下双目云台摄像头监控性能解析
双目云台摄像头在低光环境下的监控效果主要取决于其硬件配置和软件优化能力。以下是对双目云台摄像头在低光环境下监控效果的详细分析: 一、硬件配置对低光监控效果的影响 镜头与焦距 : 双目云台摄像头通常配备超大广角固定镜头和360视角的移动镜头&a…...
若依、vben-admin、三维可视化
对三维可视化,包括cesium、模型加载、GIS有关的项目和技术都可以私信,包括基础数据后台管理系统的搭建和配置...
如何Ubuntu 22.04.5 LTS 64 位 操作系统部署运行SLAM3! 详细流程
以下是在本地部署运行 ORB-SLAM3 的详细步骤,基于官方 README.md 和最佳实践整理,适用于 Ubuntu 16.04/18.04/20.04/22.04 系统: 一、系统要求与依赖项安装 1. 基础系统要求 操作系统:Ubuntu 16.04/18.04/20.04/22.04ÿ…...
LLMs可在2位精度下保持高准确率
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
爆改 toxml 组件 支持数据双向绑定 解决数据刷新问题
GGGGGGGGGGGGGGGGGithub地址自行研究 sbfkcel/towxml: 微信小程序HTML、Markdown渲染库https://github.com/sbfkcel/towxml原组件是以导入数据渲染信息为目的、本文以AI数据返回小程序为模拟效果演示 默认情况只在ready 环节进行渲染静态资源 1、对传入数据容器的位置做处理 …...
Unreal如何使用后处理材质实现一个黑屏渐变效果
文章目录 前言相机后期处理材质创建材质相机设置动态修改FadeAlpha参数使用示例最后前言 UE5 开发VR ,如何通过PostProcess轻松实现黑屏渐变效果 最简单的办法,其实是使用一个半球形模型,遮挡住相机,然后控制这个半球形遮罩的颜色透明度,至少Unity中默认的Tunneling是这么…...
施磊老师基于muduo网络库的集群聊天服务器(四)
文章目录 实现登录业务登录业务代码补全数据库接口:查询,更新状态注意学习一下里面用到的数据库api测试与问题**问题1:****问题2:** 用户连接信息与线程安全聊天服务器是长连接服务器如何找到用户B的连接?在业务层存储用户的连接信息多线程安全问题加锁! 处理客户端…...
