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

django快速实现个人博客(附源码)

文章目录

    • 一、工程目录组织结构
    • 二、模型及管理实现
      • 1、模型
      • 2、admin管理
    • 三、博客展现实现
      • 1、视图实现
      • 2、模板实现
    • 四、部署及效果
    • 五、源代码

Django作为一款成熟的Python Web开发框架提供了丰富的内置功能,如ORM(对象关系映射)、Admin管理界面、URL分发、模板系统、表单处理等,使得开发者能够快速搭建Web应用,大幅提高了开发效率。以前写过一篇博文《 Django+Vue快速实现博客网站》介绍了通过Djang+Vue快速实现博客网站,django+vue作为个人博客来说稍显复杂,部署起来也比较麻烦,Vue的单页面架构也不利于SEO,更简单的解决方案其实还是用django的模板系统快速构建web应用,对于个人博客来说部署和运维更加简单也利于SEO。下面介绍如何快速的通过django模板系统快速实现个人博客。

一、工程目录组织结构

在这里插入图片描述

二、模型及管理实现

模型及管理端的实现沿用《Django+Vue快速实现博客网站》文章中的实现,用Django搭建很快很简单。
模型很简单,根据博客要显示的内容包括有‘文章分类’、‘文章标签’、‘博客文章’、‘站点信息’、‘社交信息’、‘聚焦’,模型定义分别如下: 这里要说明的是因为博客文章内容准备用markdown编写,所以引入了mdeditor from mdeditor.fields import MDTextField 内容字段content=MDTextField(verbose_name='内容')
模型代码示例如下:

1、模型

from django.db import models
from common.basemodel import BaseModel
from mdeditor.fields import MDTextField
# Create your models here.
'''文章分类'''
class BlogCategory(BaseModel):id = models.AutoField(primary_key=True)title = models.CharField(max_length=50,verbose_name='分类名称',default='')href = models.CharField(max_length=100,verbose_name='分类路径',default='')def __str__(self):return self.titleclass Meta:verbose_name = '文章分类'verbose_name_plural = '文章分类''''文章标签'''class Tag(BaseModel):id=models.AutoField(primary_key=True)tag=models.CharField(max_length=20, verbose_name='标签')def __str__(self):return self.tagclass Meta:verbose_name='标签'verbose_name_plural='标签''''博客文章'''
class BlogPost(BaseModel):id = models.AutoField(primary_key=True)title = models.CharField(max_length=200, verbose_name='文章标题', unique = True)category = models.ForeignKey(BlogCategory, blank=True,null=True, verbose_name='文章分类', on_delete=models.DO_NOTHING)isTop = models.BooleanField(default=False, verbose_name='是否置顶')isHot = models.BooleanField(default=False, verbose_name='是否热门')isShow = models.BooleanField(default=False, verbose_name='是否显示')summary = models.TextField(max_length=500, verbose_name='内容摘要', default='')content = MDTextField(verbose_name='内容')viewsCount = models.IntegerField(default=0, verbose_name="查看数")commentsCount = models.IntegerField(default=0, verbose_name="评论数")tags = models.ManyToManyField(to=Tag, related_name="tag_post", blank=True, default=None, verbose_name="标签")blogSource = models.CharField(max_length=200, blank=True, null=True, default='',verbose_name='文章来源')pubTime = models.DateTimeField(blank=True, null=True, verbose_name='发布日期')@propertydef tag_list(self):return ','.join([i.tag for i in self.tags.all()])def __str__(self):return self.titleclass Meta:verbose_name = '博客文章'verbose_name_plural = '博客文章''''站点信息'''class Site(BaseModel):id = models.AutoField(primary_key=True)name = models.CharField(max_length=50, verbose_name='站点名称', unique = True)avatar = models.CharField(max_length=200, verbose_name='站点图标')slogan = models.CharField(max_length=200, verbose_name='站点标语')domain = models.CharField(max_length=200, verbose_name='站点域名')notice = models.CharField(max_length=200, verbose_name='站点备注')desc = models.CharField(max_length=200, verbose_name='站点描述')def __str__(self):return self.nameclass Meta:verbose_name = '站点信息'verbose_name_plural = '站点信息''''社交信息'''class Social(BaseModel):id = models.AutoField(primary_key=True)title = models.CharField(max_length=20, verbose_name='标题')icon = models.CharField(max_length=200, verbose_name='图标')color = models.CharField(max_length=20, verbose_name='颜色')href = models.CharField(max_length=100, verbose_name='路径')def __str__(self):return self.titleclass Meta:verbose_name = '社交信息'verbose_name_plural = '社交信息''''聚焦'''class Focus(BaseModel):id = models.AutoField(primary_key=True)title = models.CharField(max_length=20, verbose_name='标题')img = models.CharField(max_length=100, verbose_name='路径')def __str__(self):return self.titleclass Meta:verbose_name = '聚焦'verbose_name_plural = '聚焦''''友链'''class Friend(BaseModel):id = models.AutoField(primary_key=True)siteName = models.CharField(max_length=20, verbose_name='友链站点名称')path = models.CharField(max_length=100, verbose_name='地址路径')desc = models.CharField(max_length=200, verbose_name='描述')def __str__(self):return self.siteNameclass Meta:verbose_name = '友链'verbose_name_plural = '友链'

2、admin管理

实际上只要把模型注册到admin就可以了

from django.contrib import admin
from blog.models import *
# Register your models here.
@admin.register(BlogCategory)
class BlogCategoryAdmin(admin.ModelAdmin):admin.site.site_title="ishareblog后台"admin.site.site_header="ishareblog后台"admin.site.index_title="ishareblog管理"list_display = ['id', 'title', 'href']@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):list_display = ['title','category','isTop','isHot']search_fields = ('title',)@admin.register(Site)
class SiteAdmin(admin.ModelAdmin):list_display = ['name','slogan','domain','desc']@admin.register(Social)
class SocialAdmin(admin.ModelAdmin):list_display = ['title','href']@admin.register(Focus)
class FoucusAdmin(admin.ModelAdmin):list_display = ['title','img']@admin.register(Friend)
class FoucusAdmin(admin.ModelAdmin):list_display = ['siteName','path','desc']@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):list_display = ['id','tag']

三、博客展现实现

博客前端展现用django的模板技术实现。在网上找了一个基于Bootstrap v4.3.1的小清新风格HTML博客模板,https://gitee.com/yinqi/Light-Year-Blog 这个博客模只有三个页面,首页,详细页和About页面,样式和js都不多,比较简单。将html模板放入到templates的blog目录,为了便于维护将一些公共部分抽到了base.html,index.html和post.html 通过{% extends 'blog/base.html' %}进行应用

1、视图实现

from django.http import HttpResponse, Http404
from django.template import loader
from django.core.paginator import Paginator
from blog.models import BlogPost, Tag, BlogCategory
from django.shortcuts import render
from django.db.models import Count
from django.db.models.functions import TruncYearimport markdown2# 首页/列表页视图实现.
def index(request):category_id = request.GET.get('category')tag_id = int(request.GET.get('tag',0))year = request.GET.get('year')search = request.GET.get('search')if category_id:blogpost_list = BlogPost.objects.filter(category=category_id, isShow=True).order_by('-isTop', '-pubTime')elif tag_id:blogpost_list = BlogPost.objects.filter(tags__id=tag_id, isShow=True).order_by('-isTop', '-pubTime')elif year:blogpost_list = BlogPost.objects.filter(pubTime__year=year, isShow=True).order_by('-isTop', '-pubTime')elif search:blogpost_list = BlogPost.objects.filter(content__icontains=search, isShow=True).order_by('-isTop', '-pubTime')else:# 筛选出需要显示的博客文章blogpost_list = BlogPost.objects.filter(isShow=True).order_by('-isTop', '-pubTime', '-update_time')# 每页显示的数量per_page = 10# 创建分页器实例paginator = Paginator(blogpost_list, per_page)# 获取当前页码,如果没有提供,则默认为第一页page_number = request.GET.get('page') or 1# 获取当前页的数据page_obj = paginator.get_page(page_number)# 计算显示的页码范围current_page = int(page_number)pages_to_show = 11  # 当前页前后各5页加上当前页共11页start_page = max(current_page - 5, 1)end_page = min(start_page + pages_to_show - 1, paginator.num_pages)template = loader.get_template("blog/index.html")context = {"page_obj": page_obj,'start_page': start_page,'end_page': end_page,'hot_posts': get_hot_posts(),'tags': get_all_tags(),'post_grouped_by_year':get_post_groped_by_year(),'categories': get_categories(),'category_id': category_id,'tag_id': tag_id,'year': year,'search': search,}return HttpResponse(template.render(context, request))# 详情页视图实现.
def post_detail(request, id):try:post_obj = BlogPost.objects.get(id=id)html_content = markdown2.markdown(post_obj.content,extras=["code-color", "fenced-code-blocks", "cuddled-lists", "tables","with-toc", "highlightjs-lang"])html_content = html_content.replace('<table>', '<table class="table table-bordered">')html_content = html_content.replace('<img src=', '<img style="max-width:100%;height:auto;" src=')context = {"post_obj": post_obj, "html_content": html_content, "hot_posts": get_hot_posts(),"tags": get_all_tags(),"post_grouped_by_year":get_post_groped_by_year(),'categories': get_categories()}except BlogPost.DoesNotExist:raise Http404("Post does not exist")return render(request, "blog/post.html", context)def get_hot_posts():# 获取点赞数最高的前5篇文章hot_posts = BlogPost.objects.filter(isShow=True).order_by('-viewsCount', '-pubTime')[:5]return hot_postsdef get_all_tags():# 获取所有的标签tags = Tag.objects.all()  # 获取所有的标签return tagsdef get_post_groped_by_year():# 将发布日期截断为年份,并计算每年的文章数量。post_grouped_by_year = (BlogPost.objects.annotate(year=TruncYear('pubTime')).values('year')  # 返回的字典包含'year'键.annotate(publication_count=Count('id'))  # 计算每年的文章数量.order_by('-year')  # 按年排序)return post_grouped_by_yeardef get_categories():# 获取所有分类categories = BlogCategory.objects.all()return categories

2、模板实现

静态文件如css、js等放到static的blog目录,html模板文件放到templates的blog目录
在setting.py文件中配置 STATIC_URL = 'static/',在html模板文件中通过{% load static %} 将静态文件的地址引用进来
将公共部分抽取出来形成base.html

{% load static %}
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>XieJava的博客</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta name="author" content="xiejava" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="{% static 'blog/css/bootstrap.min.css' %}" />
<link rel="stylesheet" type="text/css" href="{% static 'blog/css/materialdesignicons.min.css' %}" />
<link rel="stylesheet" type="text/css" href="{% static 'blog/css/style.min.css' %}" />
</head>
<body>
<header class="lyear-header text-center" style="background-image:url(images/left-bg.jpg);"><div class="lyear-header-container"><div class="lyear-mask"></div><h1 class="lyear-blogger pt-lg-4 mb-0"><a href="{% url 'index' %}">XieJava的博客</a></h1><nav class="navbar navbar-expand-lg"><a class="navbar-toggler" data-toggle="collapse" data-target="#navigation" aria-controls="navigation" aria-expanded="false" aria-label="Toggle navigation"><div class="lyear-hamburger"><div class="hamburger-inner"></div></div></a><div id="navigation" class="collapse navbar-collapse flex-column"><div class="profile-section pt-3 pt-lg-0"><img class="profile-image mb-3 rounded-circle mx-auto" src="https://img9.doubanio.com/icon/ul70489051-4.jpg" width="120" height="120" alt="xiejava" ><div class="lyear-sentence mb-3">记录最好的自己<br>写是为了更好的思考,坚持写作,力争更好的思考。</div><hr></div><ul class="navbar-nav flex-column text-center"><li class="nav-item active"><a class="nav-link" href="{% url 'index' %}">首页</a></li>{% for category in categories %}<li class="nav-item"><a class="nav-link" href="{% url 'index' %}?category={{ category.id }}">{{ category.title }}</a></li>{% endfor %}<li class="nav-item"><a class="nav-link" href="{% url 'index' %}">关于我</a></li></ul><div class="my-2 my-md-3"><form class="lyear-search-form form-inline justify-content-center pt-3"><input type="text" id="search" name="search" class="form-control mr-md-1" placeholder="搜索关键词" /></form></div><!--<div ><img style="max-width:60%;height:auto;" src="https://xiejava1018.github.io/xiejavaimagesrc/images/fullbug微信公众号.jpg" alt="“fullbug”微信公众号" title="“fullbug”微信公众号"></div><div class="container d-flex align-items-end"><div  class="copyright text-center pb-3">© 2019. XieJava的博客. All rights reserved.</div></div>--></div></nav></div>
</header>
<div class="lyear-wrapper"><section class="mt-5 pb-5"><div class="container"><div class="row"><!-- 文章列表 --><div class="col-xl-8"><!-- 内容 -->{% block content %}<!-- 默认内容 -->{% endblock %}</div><!-- 内容 end --><!-- 侧边栏 --><div class="col-xl-4"><div class="lyear-sidebar"><!-- 热门文章 --><aside class="widget widget-hot-posts"><div class="widget-title">热门文章</div><ul>{% for post in hot_posts %}<li><a href="{% url 'post_detail' id=post.id %}">{{ post.title }}</a> <span>{{ post.pubTime }}</span></li>{% endfor %}</ul></aside><!-- 归档 --><aside class="widget"><div class="widget-title">归档</div><ul>{% for post in post_grouped_by_year %}<li><a href="{% url 'index' %}?year={{ post.year|date:'Y' }}" >{% if year == post.year|date:'Y' %}<b>{{ post.year|date:'Y' }}</b>{% else %}{{ post.year|date:'Y' }}{% endif %}</a> ({{ post.publication_count }})</li>{% endfor %}</ul></aside><!-- 标签 --><aside class="widget widget-tag-cloud"><div class="widget-title">标签 </div><div class="tag-cloud">{% for tag in tags %}<a href="{% url 'index' %}?tag={{ tag.id }}" {% if tag_id == tag.id %}class="badge badge-primary"{% else %}class="badge badge-light"{% endif %}>{{ tag.tag }}</a>{% endfor %}</div></aside></div></div><!-- 侧边栏 end --></div></div><!-- end container --></section>
</div>
<script type="text/javascript" src="{% static 'blog/js/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'blog/js/jquery.nicescroll.min.js' %}"></script>
<script type="text/javascript" src="{% static 'blog/js/bootstrap.min.js' %}"></script>
<script type="text/javascript" src="{% static 'blog/js/main.min.js' %}"></script>
</body>
</html>

博客首页/列表页
通过{% extends 'blog/base.html' %} 将公共部门引入进来后index.html的内容就简洁了很多
index.html

{% extends 'blog/base.html' %}<!-- 内容 -->
{% block content %}{% if page_obj.object_list.count > 0 %}{% for blogpost in page_obj.object_list %}<article class="lyear-arc"><div class="arc-header"><h2 class="arc-title"><a href="article/{{ blogpost.id }}">{{ blogpost.title }}</a></h2><ul class="arc-meta"><li><i class="mdi mdi-calendar"></i> {{ blogpost.pubTime }}</li><li><i class="mdi mdi-tag-text-outline"></i> {% for tag in blogpost.tags.all %}<a href="{% url 'index' %}?tag={{ tag.id }}">{{ tag.tag }}</a>&nbsp{% endfor %}</li><!--<li><i class="mdi mdi-comment-multiple-outline"></i> <a href="#">3 评论</a></li>--><li><i class="mdi mdi-heart-outline"></i> <a href="#">{{ blogpost.viewsCount }} 喜欢</a></li></ul></div><div class="arc-synopsis"><p>{{ blogpost.summary }}</p></div></article>{% endfor %}<!-- 分页 --><div class="row"><div class="col-lg-12"><ul class="pagination">{% if page_obj.has_previous %}<li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}"><i class="mdi mdi-chevron-left"></i></a></li>{% endif %}<!--<li class="page-item active"><a class="page-link" href="#">1</a></li><li class="page-item"><a class="page-link" href="#">2</a></li><li class="page-item"><a class="page-link" href="#">3</a></li><li class="page-item"><a class="page-link" href="#">4</a></li><li class="page-item"><a class="page-link" href="#">5</a></li>-->{% for page_no in page_obj.paginator.page_range %}{% if page_no >= start_page and page_no <= end_page %}{% if page_no == page_obj.number %}<li class="page-item active"><a class="page-link" href="#">{{ page_no }}</a></li>{% else %}<li class="page-item"><a class="page-link" href="?page={{ page_no }}{% if tag_id %}&tag={{ tag_id }}{% endif %}{% if year %}&year={{ year }}{% endif %}{% if search %}&search={{ search }}{% endif %}">{{ page_no }}</a></li>{% endif %}{% endif %}{% endfor %}{% if page_obj.has_next %}<li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}{% if tag_id %}&tag={{ tag_id }}{% endif %}{% if year %}&year={{ year }}{% endif %}{% if search %}&search={{ search }}{% endif %}"><i class="mdi mdi-chevron-right"></i></a></li>{% endif %}<p>总页数: {{ page_obj.paginator.num_pages}}</p></ul></div></div>{% else %}<p> 没有找到文章 </p>{% endif %}<!-- 分页 end -->
{% endblock %}
<!-- 内容 end -->

博客详情页post.html

{% extends 'blog/base.html' %}
<!-- 文章阅读 -->{% block content %}<article class="lyear-arc"><div class="arc-header"><h2 class="arc-title"><a href="#">{{ post_obj.title }}</a></h2><ul class="arc-meta"><li><i class="mdi mdi-calendar"></i> {{ post_obj.pubTime }}</li><li> {% for tag in post_obj.tags.all %}<a href="{% url 'index' %}?tag={{ tag.id }}">{{ tag.tag }}</a>{% endfor %}</li><!--<li><i class="mdi mdi-comment-multiple-outline"></i> <a href="#">3 评论</a></li>--><li><i class="mdi mdi-heart-outline"></i> <a href="#">{{ post_obj.viewsCount }} 喜欢</a></li></ul></div><div class="arc-preview"><img src="images/blog/post-1.png" alt="" class="img-fluid rounded" /></div><div class="lyear-arc-detail">{{ html_content|safe }}</div></article>{% endblock %}
<!-- 内容 end -->

四、部署及效果

在部署之前执行python manage.py collectstatic 将admin等其他模块用到的静态文件统一输出到static的目录。
通过 python manage.py runserver 启动应用就可以看到效果。
实际效果见 http://iblog.ishareread.com/
博客首页
在这里插入图片描述

博客详情页
在这里插入图片描述

五、源代码

所有源代码及说明见 https://gitee.com/xiejava/ishareblog


博客地址:http://xiejava.ishareread.com/

相关文章:

django快速实现个人博客(附源码)

文章目录 一、工程目录组织结构二、模型及管理实现1、模型2、admin管理 三、博客展现实现1、视图实现2、模板实现 四、部署及效果五、源代码 Django作为一款成熟的Python Web开发框架提供了丰富的内置功能&#xff0c;如ORM&#xff08;对象关系映射&#xff09;、Admin管理界面…...

K8s部署篇之手动部署二进制高可用集群架构

一、系统环境初始化 一&#xff09;架构设计 所有节点都操作&#xff1a;3个master&#xff08;etcd集群三个节点&#xff09;和2个node 1、K8s服务调用如图 2、各组件说明 1、API Server 供Kubernetes API接口&#xff0c;主要处理 REST操作以及更新ETCD中的对象所有资源增删…...

【Unity/XLua】xlua自带教程示例分析(6)—— lua协程

文章目录 工具准备协程测试 工具准备 首先是工具脚本&#xff0c;一个Coroutine_Runner.cs和一个cs_coroutine.lua 前者定义了一个继承自Monobehavior的脚本组件&#xff0c;后者则使用lua去在Unity中实例化一个挂载该组件的GameObject&#xff0c;并将其设置为DontDestroyOn…...

CV目标检测概述

文章目录 目标检测概述目标检测图像分割目标检测和图像分割的区别 目标检测概述 目标检测和图像分割是计算机视觉中的两个重要任务&#xff0c;它们有着不同的目的和应用。以下是它们的简要介绍和区别&#xff1a; 目标检测 目标检测&#xff08;Object Detection&#xff0…...

如何在notebook中运行nodejs

在 Python 生态系统的推动下&#xff0c;机器学习和人工智能日益流行&#xff0c;这带来了计算笔记本的概念。这些交互式计算平台主要是为以 Python 为中心的数据科学应用而开发的&#xff0c;它们将代码、计算输出、解释性文本和多媒体合并成一个有内聚力的文档。 作为 JavaS…...

Mybatis学习-day19

Mybatis学习-day19 1. resultMap resultMap 是 MyBatis 中最复杂的元素&#xff0c;主要用于解决实体类属性名与数据库表中字段名不一致的情况&#xff0c;可以将查询结果映射成实体对象。 <resultMap id"staffAndDep" type"com.easy.bean.Staff">…...

IDEA构建SpringBoot多模块项目

前言 最近一直在思考一个问题&#xff0c;springboot的多模块项目到底是怎么运行和运作的&#xff1f; 一般我们大部分的springboot项目都是单模块的项目&#xff0c;但是如果后续有要求开发多模块的项目应该怎么处理&#xff1f;于是基于这点进行了研究。 本次文章将会带大…...

【前端】NodeJS:nvm

文章目录 1 介绍2 使用2.1 下载安装2.2 常用命令 1 介绍 nvm全称&#xff1a;Node Version Manager&#xff0c;顾名思义它是用来管理node版本的工具&#xff0c;方便切换不同版本的Node.js。 2 使用 nvm的使用非常的简单&#xff0c;跟npm的使用方法类似。 2.1 下载安装 …...

Docker网络模式及通信

一、Docker默认的网络通信 1.1 Docker安装后默认的网络设置 Docker服务器安装完成之后&#xff0c;默认在每个宿主机会生成一个名称为docker0的网卡&#xff0c;其IP地址都是172.17.0.1/16 [rootubuntu1804 ~]#apt -y install bridge-utils [rootubuntu1804 ~]#brctl show 另…...

类模板实现实现Qt click/hover自定义操作

一、场景 常常会需要实现点击/hover时修改图片&#xff0c;可能是一个QPushButton、QLabel、QToolButton…… 由于Qt bug&#xff0c;QIcon/QSS只能实现常规态、按下态的图标切换&#xff0c;hover态的图片设置无效。 解决思路无非是安装事件过滤器、自定义类并重实现事件。 …...

Arco Design:引领未来的Vue 3创意先锋,一键开启高效与美感并重的Web开发之旅!

Arco Design 是一个基于 Vue 3 的 UI 框架&#xff0c;它提供了丰富的组件和样式&#xff0c;可以帮助开发者快速构建高质量的 Web 应用程序。以下是 Arco Design 的一些详细特点&#xff1a; 完整的设计系统&#xff1a;Arco Design 提供了一套完整的设计系统&#xff0c;包括…...

【MySQL】Linux下用C/C++链接MySQL数据库

文章目录 一、准备工作二、验证库和接口的使用三、链接数据库四、对数据库进行增删查改增删改查 五、结尾 一、准备工作 要使用C链接数据库, 首先要去MySQL官网下载官网提供的库, MySQL 社区下载. 如图所示: 接着选择: 按需选择版本: 如果用的是云服务器, 那么在安装mysql时…...

Python金融量化专栏简介

量化分析实战 - 专栏大纲 👉👉👉 《玩转Python金融量化专栏》👈👈👈 订阅本专栏的可以下载对应的代码和数据集 专栏目标 本专栏旨在帮助读者全面掌握使用Python进行金融技术指标的计算与应用,从基础到高级,涵盖各种技术指标的实现、策略开发与回测等内容。通过…...

出行365:依托分布式数据库,让出行无忧 | OceanBase案例

*本文首发自“新华社环球”杂志&#xff0c;作者张海鑫 每年的暑期旅游旺季&#xff0c;都会触发一轮轮的文旅消费的热潮&#xff0c;对于互联网出行服务行业而言&#xff0c;这既是一场盛大的狂欢&#xff0c;也是对其综合实力的严峻考验。 然而&#xff0c;自去年暑假起&…...

【C语言】位段详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、什么是位段&#xff1f; 二、…...

LVS集群实验

NAT模式 本质是多目标IP的DNAT&#xff0c;通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发RIP和DIP应在同一个IP网络&#xff0c;且应使用私网地址:RS的网关要指向DIP请求报文和响应报文都必须经由Direclor转发&#xff0c;Direclor易于成为系统瓶…...

在 Spring Boot 中使用适配器模式实现支付网关的统一接口

引言 在许多电子商务系统中&#xff0c;集成多个支付网关是常见的需求。不同的支付网关有着不同的接口和实现细节。适配器模式可以帮助我们以一种灵活的方式实现这些不同的支付网关接口。 适配器模式简介 适配器模式将一个类的接口转换为客户期望的另一个接口。适配器模式使…...

【书生·浦语大模型实战营】第三期 入门岛作业

入门岛作业 Linux闯关任务&#xff1a;完成 SSH 连接与端口映射并运行 hello_world.py。配置vscode作业内容 可选任务1&#xff1a;将Linux基础命令在开发机上完成一遍作业内容 可选任务 2&#xff1a;使用 VSCODE 远程连接开发机并创建一个conda环境作业内容 可选任务 3&#…...

Redis的String类型常用命令总结

1. set 设置一个键的值。 set key value示例&#xff1a; set username "alice"2. get 获取一个键的值。 get key示例&#xff1a; get username3. getset 设置键的值&#xff0c;并返回键的旧值。 getset key value示例&#xff1a; getset username "…...

河南萌新联赛2024第(四)场:河南理工大学

A 思路&#xff1a; B 思路&#xff1a;有一种贪心的写法&#xff0c;将整个数组排序以后比较两个相邻数的同或值&#xff0c;取 m a x max max&#xff0c;不会证明 int th(int x, int y, int z) {int res 0;for (int i z - 1; i > 0; i --) {int dx (x >> i &…...

Linux中临时使用账号提权进行业务操作

普通账号提权 su&#xff1a;永久提权 Switching users with su sudo&#xff1a;临时提权 Running commands as root with sudo 1&#xff09;su切换账号 需要对方的密码 示例&#xff1a;切换到超级管理员 su - root 建议用-这个 su root 普通用户需要执行特殊指令&…...

lwip 3. 网线拔掉后 lwip_recvfrom不能返回

当网线被拔掉后&#xff0c;‌LWIP的lwip_recvfrom函数无法返回&#xff0c;‌这通常意味着网络连接已经断开&#xff0c;‌而LWIP没有自动检测到这种断开并进行相应的处理。具体卡在这个地方&#xff1a; ret xQueueReceive(mbox->mbx, &(*msg), portMAX_DELAY); //具…...

Linux环境安装Docker Engine

Docker是一个开源的应用容器引擎&#xff0c;由Go语言开发&#xff0c;基于Linux内核技术。Docker通过将应用及其依赖打包到可移植的容器中&#xff0c;实现了应用的快速部署和高效管理。Docker容器具有轻量级、快速启动、可移植性强等特点&#xff0c;能够显著提升资源利用率和…...

大厂面试题分享

大厂面试题分享 Redis持久化方式AOF优缺点RDB优缺点 如何保证Redis和Myql的一致性索引下推输入url到浏览器发生了什么ReentranLock底层原理SpringBoot 的启动流程 Redis持久化方式 Redis提供了两种主要的持久化机制&#xff0c;分别是AOF&#xff08;Append-Only File&#xf…...

FPGA面试问题整理

1. 逻辑设计中竞争与冒险概念&#xff0c;如何识别和消除&#xff1f; 竞争&#xff1a;在组合逻辑电路中&#xff0c;信号经过多条路径到达输出端&#xff0c;每条路径经过的逻辑门不同存在时差&#xff0c;在信号变化的瞬间存在先后顺序。这种现象叫竞争。 冒险&#xff1a;由…...

3Done学习笔记

一、基本操作 1、旋转视角 使用左下角立方体选择&#xff1b; 右键可以拖动视角&#xff1b; 中间滑轮按住拖动整个舞台界面。 2、平移和旋转 右键选择移动&#xff0c;有两种方式。 第一种选择起始点&#xff0c;按照起始点位置移动到终止点&#xff08;边、角、中心点…...

AI学习指南深度学习篇-卷积层详解

AI学习指南深度学习篇-卷积层详解 一、引言 随着人工智能技术的不断发展&#xff0c;深度学习作为人工智能领域的热门分支之一&#xff0c;正在逐渐成为各个领域的核心技术。而在深度学习中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN…...

2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂

第一弹赛题的选择与前期方案的准备 opencv调用摄像头bug的解决 机械臂的组装 采用三个舵机&#xff0c;组成一个三自由度的机械臂。 并且利用电磁吸盘的方式&#xff0c;完成对棋子的抓取工作&#xff0c;后面的事实证明&#xff0c;在预算不足的情况下&#xff0c;队友手搓…...

如何在Java、C、Ruby语言中使用Newscatcher API

Newscatcher 世界实时新闻聚合API 一款强大的数据服务工具&#xff0c;它通过先进的网络爬虫技术&#xff0c;实时从全球超过70,000个新闻源聚合新闻内容。这个API能够提供全面、多角度的新闻报道&#xff0c;包括但不限于标题、作者、发布日期、全文内容以及媒体资源链接。它使…...

集合: Collection的成员方法和相关实现类

Collection: - List(有序【指的是存储和取出的顺序是一致的】且可以发生重复&#xff0c;且有索引的概念) - ArrayList&#xff1a; 底层数据结构是数组&#xff0c;查询快&#xff0c;增删慢&#xff0c;线程不安全的&#xff0c;效率高。 - …...