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> {% 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开发框架提供了丰富的内置功能,如ORM(对象关系映射)、Admin管理界面…...
K8s部署篇之手动部署二进制高可用集群架构
一、系统环境初始化 一)架构设计 所有节点都操作:3个master(etcd集群三个节点)和2个node 1、K8s服务调用如图 2、各组件说明 1、API Server 供Kubernetes API接口,主要处理 REST操作以及更新ETCD中的对象所有资源增删…...
【Unity/XLua】xlua自带教程示例分析(6)—— lua协程
文章目录 工具准备协程测试 工具准备 首先是工具脚本,一个Coroutine_Runner.cs和一个cs_coroutine.lua 前者定义了一个继承自Monobehavior的脚本组件,后者则使用lua去在Unity中实例化一个挂载该组件的GameObject,并将其设置为DontDestroyOn…...
CV目标检测概述
文章目录 目标检测概述目标检测图像分割目标检测和图像分割的区别 目标检测概述 目标检测和图像分割是计算机视觉中的两个重要任务,它们有着不同的目的和应用。以下是它们的简要介绍和区别: 目标检测 目标检测(Object Detection࿰…...
如何在notebook中运行nodejs
在 Python 生态系统的推动下,机器学习和人工智能日益流行,这带来了计算笔记本的概念。这些交互式计算平台主要是为以 Python 为中心的数据科学应用而开发的,它们将代码、计算输出、解释性文本和多媒体合并成一个有内聚力的文档。 作为 JavaS…...
Mybatis学习-day19
Mybatis学习-day19 1. resultMap resultMap 是 MyBatis 中最复杂的元素,主要用于解决实体类属性名与数据库表中字段名不一致的情况,可以将查询结果映射成实体对象。 <resultMap id"staffAndDep" type"com.easy.bean.Staff">…...
IDEA构建SpringBoot多模块项目
前言 最近一直在思考一个问题,springboot的多模块项目到底是怎么运行和运作的? 一般我们大部分的springboot项目都是单模块的项目,但是如果后续有要求开发多模块的项目应该怎么处理?于是基于这点进行了研究。 本次文章将会带大…...
【前端】NodeJS:nvm
文章目录 1 介绍2 使用2.1 下载安装2.2 常用命令 1 介绍 nvm全称:Node Version Manager,顾名思义它是用来管理node版本的工具,方便切换不同版本的Node.js。 2 使用 nvm的使用非常的简单,跟npm的使用方法类似。 2.1 下载安装 …...
Docker网络模式及通信
一、Docker默认的网络通信 1.1 Docker安装后默认的网络设置 Docker服务器安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡,其IP地址都是172.17.0.1/16 [rootubuntu1804 ~]#apt -y install bridge-utils [rootubuntu1804 ~]#brctl show 另…...
类模板实现实现Qt click/hover自定义操作
一、场景 常常会需要实现点击/hover时修改图片,可能是一个QPushButton、QLabel、QToolButton…… 由于Qt bug,QIcon/QSS只能实现常规态、按下态的图标切换,hover态的图片设置无效。 解决思路无非是安装事件过滤器、自定义类并重实现事件。 …...
Arco Design:引领未来的Vue 3创意先锋,一键开启高效与美感并重的Web开发之旅!
Arco Design 是一个基于 Vue 3 的 UI 框架,它提供了丰富的组件和样式,可以帮助开发者快速构建高质量的 Web 应用程序。以下是 Arco Design 的一些详细特点: 完整的设计系统:Arco Design 提供了一套完整的设计系统,包括…...
【MySQL】Linux下用C/C++链接MySQL数据库
文章目录 一、准备工作二、验证库和接口的使用三、链接数据库四、对数据库进行增删查改增删改查 五、结尾 一、准备工作 要使用C链接数据库, 首先要去MySQL官网下载官网提供的库, MySQL 社区下载. 如图所示: 接着选择: 按需选择版本: 如果用的是云服务器, 那么在安装mysql时…...
Python金融量化专栏简介
量化分析实战 - 专栏大纲 👉👉👉 《玩转Python金融量化专栏》👈👈👈 订阅本专栏的可以下载对应的代码和数据集 专栏目标 本专栏旨在帮助读者全面掌握使用Python进行金融技术指标的计算与应用,从基础到高级,涵盖各种技术指标的实现、策略开发与回测等内容。通过…...
出行365:依托分布式数据库,让出行无忧 | OceanBase案例
*本文首发自“新华社环球”杂志,作者张海鑫 每年的暑期旅游旺季,都会触发一轮轮的文旅消费的热潮,对于互联网出行服务行业而言,这既是一场盛大的狂欢,也是对其综合实力的严峻考验。 然而,自去年暑假起&…...
【C语言】位段详解
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 🎁代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、什么是位段? 二、…...
LVS集群实验
NAT模式 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发RIP和DIP应在同一个IP网络,且应使用私网地址:RS的网关要指向DIP请求报文和响应报文都必须经由Direclor转发,Direclor易于成为系统瓶…...
在 Spring Boot 中使用适配器模式实现支付网关的统一接口
引言 在许多电子商务系统中,集成多个支付网关是常见的需求。不同的支付网关有着不同的接口和实现细节。适配器模式可以帮助我们以一种灵活的方式实现这些不同的支付网关接口。 适配器模式简介 适配器模式将一个类的接口转换为客户期望的另一个接口。适配器模式使…...
【书生·浦语大模型实战营】第三期 入门岛作业
入门岛作业 Linux闯关任务:完成 SSH 连接与端口映射并运行 hello_world.py。配置vscode作业内容 可选任务1:将Linux基础命令在开发机上完成一遍作业内容 可选任务 2:使用 VSCODE 远程连接开发机并创建一个conda环境作业内容 可选任务 3&#…...
Redis的String类型常用命令总结
1. set 设置一个键的值。 set key value示例: set username "alice"2. get 获取一个键的值。 get key示例: get username3. getset 设置键的值,并返回键的旧值。 getset key value示例: getset username "…...
河南萌新联赛2024第(四)场:河南理工大学
A 思路: B 思路:有一种贪心的写法,将整个数组排序以后比较两个相邻数的同或值,取 m a x max max,不会证明 int th(int x, int y, int z) {int res 0;for (int i z - 1; i > 0; i --) {int dx (x >> i &…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
