社交app圈子模块0到1实现
一、逻辑分析
- 用户相关
- 用户需要能够创建圈子,这涉及到用户身份验证,确保只有注册用户可以进行创建操作。
- 每个圈子有创建者,创建者对圈子有一定的管理权限,如设置圈子规则、邀请成员等。
- 圈子信息
- 圈子需要有名称、简介、头像等基本信息,用于展示和识别。
- 可以设置圈子的类型,如公开圈子、私密圈子等。公开圈子任何人可以申请加入或直接加入,私密圈子则需要管理员邀请或批准加入申请。
- 成员管理
- 用户可以申请加入圈子,管理员需要能够审批这些申请。
- 管理员可以将成员移出圈子,成员也可以主动退出圈子。
- 内容发布与互动
- 圈子成员可以发布帖子,帖子可以包含文字、图片、视频等多种形式。
- 其他成员可以对帖子进行点赞、评论、分享等操作,以促进圈子内的互动。
二、程序框架结构化输出
- 前端部分
- 页面设计:
- 圈子创建页面:包含输入圈子名称、简介、选择头像、设置圈子类型等功能。
- 圈子列表页面:展示所有圈子的名称、简介、成员数量等信息。
- 圈子详情页面:展示圈子的详细信息、成员列表、发布的帖子等。
- 帖子发布页面:输入帖子内容、选择图片或视频等。
- 帖子详情页面:展示帖子内容、点赞数、评论数,提供点赞、评论、分享按钮。
- 交互逻辑:
- 处理用户的点击、输入等操作,与后端进行数据交互,如发送创建圈子请求、获取圈子列表等。
- 页面设计:
- 后端部分
- 数据库设计:
- 用户表:存储用户的基本信息,如用户名、密码、联系方式等。
- 圈子表:包含圈子名称、简介、头像、类型、创建者 ID 等字段。
- 成员表:记录用户与圈子的关系,包含用户 ID、圈子 ID、加入时间等。
- 帖子表:存储帖子内容、发布者 ID、圈子 ID、发布时间等信息。
- 互动表:记录点赞、评论、分享等操作,包含操作类型(点赞、评论、分享)、操作者 ID、帖子 ID 等。
- API 设计:
- 创建圈子 API:接收用户输入的圈子信息,创建圈子并返回创建结果。
- 获取圈子列表 API:根据条件(如公开 / 私密、热门程度等)返回圈子列表。
- 获取圈子详情 API:返回指定圈子的详细信息。
- 申请加入圈子 API:用户发送加入申请,后端记录申请信息并通知管理员。
- 审批加入申请 API:管理员审批加入申请,同意或拒绝。
- 发布帖子 API:接收用户输入的帖子内容,保存帖子并返回发布结果。
- 获取帖子详情 API:返回指定帖子的详细信息及互动数据。
- 点赞 / 评论 / 分享 API:处理用户的互动操作。
- 数据库设计:
三、解决方案
- 代码示例(以 Python + Django + MySQL 为例)
- 安装必要的库:
pip install django djangorestframework mysqlclient
- 创建 Django 项目和应用:
django - admin startproject socialapp cd socialapp python manage.py startapp circle
- 配置数据库(在
settings.py
中):DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME':'socialapp_db','USER': 'root','PASSWORD': 'password','HOST': '127.0.0.1','PORT': '3306',} }
- 定义模型(在
circle/models.py
中):from django.db import models from django.contrib.auth.models import Userclass Circle(models.Model):name = models.CharField(max_length = 100)intro = models.TextField(blank = True)avatar = models.ImageField(upload_to='circle_avatars/', blank = True)circle_type = models.CharField(max_length = 20,choices=(('public', '公开'), ('private', '私密')), default='public')creator = models.ForeignKey(User, on_delete=models.CASCADE)create_time = models.DateTimeField(auto_now_add=True)def __str__(self):return self.nameclass Member(models.Model):user = models.ForeignKey(User, on_delete=models.CASCADE)circle = models.ForeignKey(Circle, on_delete=models.CASCADE)join_time = models.DateTimeField(auto_now_add=True)class Meta:unique_together = ('user', 'circle')def __str__(self):return f"{self.user.username} - {self.circle.name}"class Post(models.Model):content = models.TextField()author = models.ForeignKey(User, on_delete=models.CASCADE)circle = models.ForeignKey(Circle, on_delete=models.CASCADE)publish_time = models.DateTimeField(auto_now_add=True)image = models.ImageField(upload_to='post_images/', blank=True)video = models.FileField(upload_to='post_videos/', blank=True)def __str__(self):return f"{self.author.username}'s post in {self.circle.name}"class Interaction(models.Model):INTERACTION_TYPES = (('like', '点赞'),('comment', '评论'),('share', '分享'))interaction_type = models.CharField(max_length=10, choices=INTERACTION_TYPES)user = models.ForeignKey(User, on_delete=models.CASCADE)post = models.ForeignKey(Post, on_delete=models.CASCADE)interaction_time = models.DateTimeField(auto_now_add=True)def __str__(self):return f"{self.user.username} {self.interaction_type} {self.post}"
- 安装必要的库:
代码解释(续)
- Circle 模型:用于存储圈子的基本信息,包括名称、简介、头像、类型以及创建者。
circle_type
字段通过choices
定义了公开和私密两种类型的选项。 - Member 模型:通过
user
和circle
两个外键建立用户与圈子的关联关系,unique_together
确保一个用户在一个圈子中只能存在一次。 - Post 模型:记录帖子的内容、作者、所属圈子以及发布时间,还可以上传图片和视频。
- Interaction 模型:存储用户对帖子的互动信息,通过
interaction_type
字段区分点赞、评论和分享操作。
序列化器(在 circle/serializers.py
中)
from rest_framework import serializers
from.models import Circle, Member, Post, Interaction
from django.contrib.auth.models import Userclass UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ('id', 'username')class CircleSerializer(serializers.ModelSerializer):creator = UserSerializer()class Meta:model = Circlefields = ('id', 'name', 'intro', 'avatar', 'circle_type', 'creator', 'create_time')class MemberSerializer(serializers.ModelSerializer):user = UserSerializer()circle = CircleSerializer()class Meta:model = Memberfields = ('id', 'user', 'circle', 'join_time')class PostSerializer(serializers.ModelSerializer):author = UserSerializer()circle = CircleSerializer()class Meta:model = Postfields = ('id', 'content', 'author', 'circle', 'publish_time', 'image', 'video')class InteractionSerializer(serializers.ModelSerializer):user = UserSerializer()post = PostSerializer()class Meta:model = Interactionfields = ('id', 'interaction_type', 'user', 'post', 'interaction_time')
代码解释(续)
- UserSerializer:用于序列化用户信息,只返回用户的
id
和username
。 - CircleSerializer:序列化圈子信息,通过嵌套
UserSerializer
来展示圈子创建者的信息。 - MemberSerializer:序列化成员信息,同时展示用户和圈子的相关信息。
- PostSerializer:序列化帖子信息,包含作者和所属圈子的信息。
- InteractionSerializer:序列化互动信息,展示进行互动的用户和被互动的帖子信息。
视图(在 circle/views.py
中)
from rest_framework.viewsets import ModelViewSet
from.models import Circle, Member, Post, Interaction
from.serializers import CircleSerializer, MemberSerializer, PostSerializer, InteractionSerializer
from rest_framework.permissions import IsAuthenticated
from django.shortcuts import get_object_or_404class CircleViewSet(ModelViewSet):queryset = Circle.objects.all()serializer_class = CircleSerializerpermission_classes = [IsAuthenticated]def perform_create(self, serializer):serializer.save(creator=self.request.user)class MemberViewSet(ModelViewSet):queryset = Member.objects.all()serializer_class = MemberSerializerpermission_classes = [IsAuthenticated]class PostViewSet(ModelViewSet):queryset = Post.objects.all()serializer_class = PostSerializerpermission_classes = [IsAuthenticated]def perform_create(self, serializer):circle_id = self.request.data.get('circle')circle = get_object_or_404(Circle, id=circle_id)serializer.save(author=self.request.user, circle=circle)class InteractionViewSet(ModelViewSet):queryset = Interaction.objects.all()serializer_class = InteractionSerializerpermission_classes = [IsAuthenticated]
代码解释(续)
- CircleViewSet:
- 这是一个基于
ModelViewSet
的视图集,用于处理与Circle
模型相关的各种 HTTP 请求(如 GET、POST、PUT、DELETE 等)。 queryset
属性指定了该视图集操作的数据集为所有的Circle
对象。serializer_class
用于指定在处理Circle
对象时使用的序列化器。permission_classes
要求只有经过身份验证的用户才能访问这些视图。perform_create
方法在创建新的Circle
对象时,将当前请求的用户设置为创建者。
- 这是一个基于
- MemberViewSet:
- 同样基于
ModelViewSet
,用于处理与Member
模型相关的请求。 - 它使用
MemberSerializer
进行序列化,并要求用户经过身份验证。
- 同样基于
- PostViewSet:
- 处理与
Post
模型相关的请求。 - 在创建新帖子时,
perform_create
方法从请求数据中获取所属圈子的id
,通过get_object_or_404
方法获取对应的Circle
对象,然后将当前用户作为作者,指定的圈子作为所属圈子保存新帖子。
- 处理与
- InteractionViewSet:
- 用于处理与
Interaction
模型相关的请求,使用InteractionSerializer
进行序列化,并要求用户经过身份验证。
- 用于处理与
URL 配置(在 socialapp/urls.py
中)
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from circle.views import CircleViewSet, MemberViewSet, PostViewSet, InteractionViewSetrouter = DefaultRouter()
router.register(r'circles', CircleViewSet)
router.register(r'members', MemberViewSet)
router.register(r'posts', PostViewSet)
router.register(r'interactions', InteractionViewSet)urlpatterns = [path('admin/', admin.site.urls),path('', include(router.urls))
]
代码解释(续)
- 首先导入了必要的模块和视图集。
- 创建了一个
DefaultRouter
对象router
。 - 使用
router.register
方法将各个视图集注册到对应的 URL 路径上。例如,circles
路径对应CircleViewSet
,这意味着所有以/circles/
开头的 URL 请求将由CircleViewSet
来处理。 - 在
urlpatterns
中,将管理后台的 URL 和路由器生成的 URL 包含进来。
可能遇到的问题及解决方法
- 性能问题:
- 问题:当圈子和帖子数量增多时,数据库查询可能会变得缓慢。
- 解决方法:
- 对经常查询的字段添加索引,例如在
Circle
模型的name
字段、Post
模型的publish_time
字段等添加索引。可以在模型定义中使用db_index=True
参数,如name = models.CharField(max_length = 100, db_index=True)
- 对经常查询的字段添加索引,例如在
-
- 分页问题:
- 问题:在获取大量圈子或帖子列表时,一次性返回所有数据会导致响应时间长和内存消耗大。
- 解决方法:在 Django REST framework 中使用分页功能。例如,在
settings.py
中配置分页设置:
- 分页问题:
REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 10 # 每页显示10条数据,可以根据需求调整
}
- 视图集不需要额外修改,Django REST framework 会自动对列表视图进行分页处理。客户端可以通过在 URL 中添加
?page=X
(X 为页码)来获取特定页面的数据。 - 缓存问题:
- 问题:对于一些不经常变化的数据,如圈子的基本信息,频繁查询数据库会浪费资源。
- 解决方法:可以使用 Django 的缓存机制。例如,在
settings.py
中配置缓存:
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake'}
}
- 然后在视图中对数据进行缓存。以
CircleViewSet
为例,可以使用cache_page
装饰器:
from django.views.decorators.cache import cache_page
from rest_framework.viewsets import ModelViewSet
from.models import Circle
from.serializers import CircleSerializer
from rest_framework.permissions import IsAuthenticated@cache_page(60 * 15) # 缓存15分钟
class CircleViewSet(ModelViewSet):queryset = Circle.objects.all()serializer_class = CircleSerializerpermission_classes = [IsAuthenticated]def perform_create(self, serializer):serializer.save(creator=self.request.user)
- 安全问题:
- 身份验证和授权问题:
- 问题:仅使用
IsAuthenticated
权限类可能不够细致,例如不同角色(圈子创建者、普通成员)应该有不同的权限。 - 解决方法:自定义权限类。例如,创建一个权限类来判断用户是否是圈子的创建者:
- 问题:仅使用
- 身份验证和授权问题:
from rest_framework.permissions import BasePermissionclass IsCircleCreator(BasePermission):def has_object_permission(self, request, view, obj):return obj.creator == request.user
- 然后在
CircleViewSet
中可以根据不同的操作设置不同的权限:
class CircleViewSet(ModelViewSet):queryset = Circle.objects.all()serializer_class = CircleSerializerpermission_classes = [IsAuthenticated]def get_permissions(self):if self.action in ['update', 'destroy']:return [IsCircleCreator()]return super().get_permissions()def perform_create(self, serializer):serializer.save(creator=self.request.user)
- 防止 SQL 注入:
- 问题:如果在数据库查询中直接使用用户输入的数据,可能会导致 SQL 注入攻击。
- 解决方法:Django 的 ORM 已经对大多数情况进行了防护,在使用
filter
、get
等方法时会自动对数据进行转义。但是在使用原始 SQL 查询时要特别小心。例如,尽量避免这样的写法:
raw_query = "SELECT * FROM circle_circle WHERE name = '%s'" % user_input_name
circles = Circle.objects.raw(raw_query)
- 而是使用参数化查询:
circles = Circle.objects.raw("SELECT * FROM circle_circle WHERE name = %s", [user_input_name])
- 文件上传问题:
- 文件大小限制问题:
- 问题:默认情况下,Django 有文件上传大小限制,如果用户上传的图片或视频超过限制,会导致上传失败。
- 解决方法:在
settings.py
中增加或修改文件上传大小限制:
- 文件大小限制问题:
DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 5 # 5MB,可以根据需求调整
-
- 文件存储问题:
- 问题:如果使用的是本地文件系统存储上传的文件,在部署到生产环境或多台服务器时,可能会出现文件访问不一致的问题。
- 解决方法:可以考虑使用云存储服务,如阿里云 OSS、腾讯云 COS 等。以阿里云 OSS 为例,首先安装
aliyun - oss - python - sdk
库:
- 文件存储问题:
pip install aliyun - oss - python - sdk
- 然后在
settings.py
中配置相关参数:
import oss2# 阿里云 OSS 配置
OSS_ACCESS_KEY_ID = 'your_access_key_id'
OSS_ACCESS_KEY_SECRET = 'your_access_key_secret'
OSS_ENDPOINT = 'your_endpoint'
OSS_BUCKET_NAME = 'your_bucket_name'# 自定义文件存储类
class OSSStorage(FileSystemStorage):def __init__(self):auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)self.bucket = oss2.Bucket(auth, OSS_ENDPOINT, OSS_BUCKET_NAME)super().__init__()def _open(self, name, mode='rb'):response = self.bucket.get_object(name)return response.read()def _save(self, name, content):self.bucket.put_object(name, content)return name# 设置默认文件存储
DEFAULT_FILE_STORAGE = 'your_project_name.settings.OSSStorage'
总结
本项目围绕社交圈子相关功能进行了全面的开发,涵盖了圈子、成员、帖子和互动等核心模型的定义,通过序列化器将模型数据转换为合适的格式以便在 API 中传输,利用视图集实现了对各个模型的增删改查操作,并通过路由器进行 URL 配置。
在开发过程中,考虑到了多个方面的问题及解决方案。性能方面,通过添加索引、分页和缓存机制来优化数据库查询和响应速度;安全方面,包括身份验证、授权以及防止 SQL 注入等措施;文件上传方面,处理了文件大小限制和存储方案的问题。
通过这样完整的设计和实现,能够构建一个功能较为完善、性能和安全性都有一定保障的社交圈子 API 系统,为后续基于该系统的业务逻辑开发和功能扩展提供了坚实的基础。无论是独立应用还是作为更大项目的一部分,都具备一定的可扩展性和适应性,能够满足不同场景下对于社交圈子功能的需求。
相关文章:
社交app圈子模块0到1实现
一、逻辑分析 用户相关 用户需要能够创建圈子,这涉及到用户身份验证,确保只有注册用户可以进行创建操作。每个圈子有创建者,创建者对圈子有一定的管理权限,如设置圈子规则、邀请成员等。 圈子信息 圈子需要有名称、简介、头像等基…...
OpenCV--图像边缘检测
在计算机视觉和图像处理领域,边缘检测是极为关键的技术。边缘作为图像中像素值发生急剧变化的区域,承载了图像的重要结构信息,在物体识别、图像分割、目标跟踪等众多应用场景中发挥着核心作用。OpenCV 作为强大的计算机视觉库,提供…...
批量压缩 jpg/png 等格式照片|批量调整图片的宽高尺寸
图片格式种类非常的多,并且不同的图片由于像素、尺寸不一样,可能占用的空间也会不一样。文件太大会占用较多的磁盘空间,传输及上传系统都非常不方便,可能会收到限制,因此我们经常会碰到需要对图片进行压缩的需求。如何…...
[Linux系统编程]多线程
多线程 1. 线程1.1 线程的概念1.2 进程与线程对比1.3 轻量级进程 2. Linux线程控制2.1 POSIX 线程(pthread)2.2 线程ID、pthread_t、和进程地址空间的关系2.2.1 pthread_self2.2.2 pthread_create2.2.3 pthread_join2.2.4 线程终止的三种方式2.2.5 pthre…...
进程状态(运行 阻塞 僵尸)及其场景分析
【Linux学习笔记】Linux基本指令及其分析 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 前言 哈喽,各位小伙伴大家好!上期我们讲了进程PCB 今天我们讲的是进程状态(运行 阻塞 僵尸)及其场景分析。话不多说&#…...
程序化广告行业(67/89):DMP系统标签制作与人群拓展深度解析
程序化广告行业(67/89):DMP系统标签制作与人群拓展深度解析 大家好!在之前的分享中,我们对程序化广告的多个关键环节进行了探讨。今天,咱们继续深入了解程序化广告中的DMP系统,聚焦于标签制作和…...
【QT】QPixmap QImage QBitmap QPicture
文章目录 **1. QPixmap****特点****典型应用场景****示例** **2. QImage****特点****典型应用场景****示例** **3. QBitmap****特点****示例** **4. 三者的主要区别****5. 如何选择?****使用 QPixmap 的情况****使用 QImage 的情况****使用 QBitmap 的情况** **6. 相…...
如何开通google Free Tier长期免费云服务器(1C/1G)
Google宣布的一项政策,为标准层级的网络提供每地域200G的免费流量。两项政策结合,于是便可以得到一台1核心、1G内存、30G磁盘、200G流量的小云服务器,可玩性大大提高。这篇文章就分享一下如何正确开机,避免产生额外的费用。 免费…...
Kaggle房价预测
实战 Kaggle 比赛:预测房价 这里李沐老师讲的比较的细致,我根据提供的代码汇总了一下: import hashlib import os import tarfile import zipfile import requests import numpy as np import pandas as pd import torch from matplotlib i…...
4.7学习总结 java集合进阶
集合进阶 泛型 //没有泛型的时候,集合如何存储数据 //结论: //如果我们没有给集合指定类型,默认认为所有的数据类型都是object类型 //此时可以往集合添加任意的数据类型。 //带来一个坏处:我们在获取数据的时候,无法使用他的特有行为。 //此…...
设计模式 - 代理模式Proxy
设计思想: 举个通俗的例子,你想找某局长帮你做一件事情,但局长官位显赫,你又不能轻易见着,你就想到了找他的秘书,通过她传话给局长,这样你就等于请他的秘书帮你办成了那件事。秘书为什么就可以…...
计算机网络体系结构(一)
1.计算机网络概述 1.1计算机网络的概念 计算机网络是由相互连接的计算机及其周边设备构成的系统,这些计算机和设备通过各种通信介质实现数据和资源的共享。计算机网络的主要目的是为了增强信息传递的效率、便利性和可靠性。以下是一些计算机网络的关键概念…...
数据结构与算法-数学-基础数学2(扩展欧几里得算法,组合数问题)
六:扩展欧几里得算法 同余: 若 a≡b(modm),则 m 整除 a−b,即 abkm(k 为整数)。 扩展欧几里得算法 扩展欧几里得算法可用于求解 axbygcd(a,b) 的一组整数解。 #include <iostream> using namesp…...
【力扣hot100题】(072)柱状图中的最大矩阵
这绝对是我做过印象最深的算法题之一。(还有是那道盛水最多的贪心题) 当初不知道想了多少个日日夜夜,所幸这道题已经深深的烙印在了我的脑海里。 现在看来也没那么可怕()不过初见确实非常难想到单调栈。 方法如下&a…...
T-SQL语言的压力测试
T-SQL语言的压力测试 随着数据驱动技术的发展,数据库在现代应用中的角色愈加重要。而在数据库管理系统中,微软的SQL Server凭借其强大的功能和易用性,广泛应用于各行业。在这一环境中,T-SQL(Transact-SQL)…...
debian 系统gnome怎么关闭触摸屏三指滑动
ubuntu如何限制三指手势操作_ubuntu 手势-CSDN博客 参考方案给上面了, kiosk模式 就是专用模式,类似于广告机、售货机那种。 方案 在 Debian 系统的 GNOME 桌面环境中,可以通过以下方法关闭触摸屏三指滑动功能: 安装 gnome-tweaks 工具:...
【9】搭建k8s集群系列(二进制部署)之安装work-node节点组件(kube-proxy)和网络组件calico
承接上一篇文章,继续安装工作节点的第二个组件:kube-proxy 一、创建配置文件 cat > /opt/kubernetes/cfg/kube-proxy.conf << EOF KUBE_PROXY_OPTS"--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --config/opt/kubern…...
MongoDB及Yapi迁移数据
一、MongoDB安装及迁移 1、导入MongoDB GPG密钥 sudo rpm --import https://www.mongodb.org/static/pgp/server-5.0.asc 2、创建MongoDB 安装源配置文件 vi /etc/yum.repos.d/mongodb-org-5.0.repo,添加以下内容: [mongodb-org-5.0] nameMongoDB Repo…...
高效解读机器语言,profinet转ethernet ip网关烟草企业自动化升级案例分析
工业通信协议转换在烟草生产线的实践应用 某中型烟草生产企业为提高自动化水平,引进了西门子S7-1500系列PLC控制系统和防爆型科氏力质量流量计。但在系统集成阶段,技术人员发现PLC支持的PROFINET协议与流量计采用的EtherNet/IP协议存在互操作障碍&#x…...
使用Scade实现神经网络算法
在ERTS2022中,ANSYS 发表了使用Scade实现神经网络AI算法的相关工作。论文题目为《Programming Neural Networks Inference in a Safety-Critical Simulation-based Framework》 背景与挑战 神经网络在安全关键系统中的应用:随着嵌入式系统中自主性的引入…...
rom定制系列------小米10pro机型定制解锁固件 原生安卓15批量线刷固件 操作解析与界面预览
注意;固件用于自己机型忘记密码或者手机号注销等出现设备锁 过保修期 售后无视的机型,勿用于非法途径 目前有粉丝联系,自己的机型由于手机号注销导致手机更新系统后出现设备锁界面。另外也没有解锁bl。目前无法使用手机。经过询问是小米10pro机型。根据…...
2023年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2023年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激…...
2014年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2014年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
【Docker基础】--查阅笔记1
目录 Docker是什么Docker解决什么问题Docker的理念Docker基本组成镜像(image)容器(container)仓库(registry) Docker平台架构Docker基本实现原理 Docker常用命令总结 Docker是什么 Docker解决什么问题 统…...
算法(动态规划)
动态规划 基本思想 将问题分解为相互重叠的子问题 定义子问题:将原问题分解为若干个子问题。确定状态转移方程:找到子问题之间的递推关系。边界条件:确定初始状态的值。递推计算:根据状态转移方程和边界条件逐步计算子问题的解。…...
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡
2025 年前端与后端开发方向的抉择与展望-优雅草卓伊凡 在 2025 年这个科技浪潮奔涌的时代,软件开发领域持续变革,前端与后端开发方向的抉择,成为众多从业者和爱好者亟待破解的关键命题。卓伊凡就频繁收到这样的疑问:“2025 年了&…...
指纹浏览器技术架构解析:高并发批量注册业务的工程化实践——基于分布式指纹引擎与防关联策略的深度实现
一、技术背景与行业痛点 在跨境电商、广告投放、问卷调查等场景中,批量注册与多账号矩阵运营已成为刚需。然而,主流平台(如亚马逊、Facebook、Google)的风控系统通过浏览器指纹追踪(Canvas/WebGL/WebRTC等)…...
基于SpringBoot的“智慧医疗采购系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“智慧医疗采购系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 局部E-R图 系统首页界面 系统…...
codeforces B. Large Array and Segments
题目简述: 给定一个长度为n的数组,以及两个整数k和p,该数组可以通过复制在增加长度,可以复制k次,我们最后要找到保证后缀和至少为p的首元结点的数量 思路简述: 找到有多少个完整的原数组n,最…...
VS Code-i18n Ally国际化插件
前言 本文借鉴:i18n Ally 插件帮你轻松搞定国际化需求-按模块划分i18n Ally 是一款 VS Code 插件,它能通过可视 - 掘金本来是没有准备将I18n Ally插件单独写一个博客的,但是了解过后,功能强大,使用方便,解决…...
ResNet改进(21):基于ECA注意力机制的ResNet18网络实现
一、引言 在计算机视觉领域,ResNet(残差网络)一直是图像分类任务中的重要基准模型。今天我们要介绍的是一个改进版的ResNet18网络,它在传统ResNet结构的基础上加入了ECA(Efficient Channel Attention)注意力机制,能够在不显著增加计算量的情况下提升模型性能。 二、网络…...
[ERROR] Some problems were encountered while processing the POMs
记录一次maven的错误 问题复现: 我在ruoyi-vue-plus项目的ruoyi-modules中新建了一个子项目ruoyi-network-telphonem,然后某一次编译的时候提示SysTenantServiceImpl找不到无参的构造函数,检查了很久都没发现问题,于是我想着删掉本地maven仓…...
【网络协议】WebSocket讲解
目录 webSocket简介 连接原理解析: 客户端API 服务端API(java) 实战案例 (1)引入依赖 (2)编写服务端逻辑 (3)注册配置类 (4)前端连接 WebSocket 示例…...
什么是可靠性工程师?
一、什么是可靠性工程师? 可靠性工程师就是负责确保产品在使用过程中不出故障、不给客户添麻烦。 你可以理解为是那种“挑毛病的人”,但不是事后挑,是提前想清楚产品在哪些情况下可能会出问题,然后解决掉。 比如: …...
Next.js + SQLite 项目 Docker 生产环境部署方案
以下是完整的 Next.js SQLite 项目 Docker 生产环境部署方案: 1. 项目结构准备 your-project/ ├── prisma/ │ ├── schema.prisma │ └── migrations/ ├── app/ ├── lib/ ├── Dockerfile ├── docker-compose.yml ├── .dockerignore └…...
记录1---20250407
哈佛结构:指令和数据放在不同的存储器,因为在使用流水线时,方便数据和指令的读取和存入。 冯诺依曼结构:指令和数据放在同一个存储器。 处理器的存储结构:CPU内部采用hierarchy 存储结构,一般由 CPU内部…...
php调用大模型应用接口实现流式输出以及数据过滤
最近开发智能客服,需要用php调用已有的大模型应用接口流式输出vue前端调用打字机效果展示。这里整理了php调用大模型流式输出业务过滤等的核心实现部分,分享给大家。 前置条件:大模型应用接口已经打通(最好是通过postman或者apip…...
数据结构:红黑树
为什么要以这个结构为题?那就要追溯到CSTL库中的两种map/set,分别基于红黑树与哈希表,我是根本分不清楚。为了搞清楚其区别,我会重点聊聊红黑树和哈希表。 当然也会简单介绍一下树的结构。 树 Tree 首先需要简单了解树这个数据结…...
nginx配置ssl证书,实现https安全访问.
前置条件: 名称 ip地址端口号nginx服务器192.168.59.3080/443server服务器190.168.59.318080/8081/8082 安装nginx服务: 参见: 编译安装nginx-CSDN博客 启动后端web服务器192.168.59.31: (#后端要被代理的web服务器要有docker服务并且配置相关的加速服务) 拉取tomcat容器…...
《当区块链穿上防弹衣:落盘加密技术全景拆解》
落盘加密是区块链技术中一项重要的数据安全机制,主要用于保护节点本地存储的敏感数据不被非法访问。本文将全面解析区块链落盘加密的技术原理、实施方法、应用价值,并与其他加密技术进行比较分析。 🔒 落盘加密的技术原理 落盘加密(Disk Encryption)是指对存储在物理磁盘…...
新HTML5
在新HTML5中,DOCTYPE声明以及字符编码声明都非常简单: <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Document</title> </head> <body>内容 </body> </html>HTM…...
DeepSeek-MLA
MLA 结构 需要缓存 KV 向量共用的压缩隐特征K 向量多头共享的带位置编码的向量 为什么带有位置信息的 Q 向量来自于隐特征向量,而带有位置的 K 向量来自于 H 向量且共享呢? 最好的方法肯定是从H向量直接计算并且不共享,但是会大大增加显存使…...
SQL:数据类型(Data Types)
目录 数字数据类型(Numeric data types) 非数据类型(Non-numeric data types) 日期和时间类型(Date and Time Types) NULL(缺失或未知值) 当你在数据库中创建表格时,你必须指明表中每一列可以保存的数据…...
AF3 OpenFoldBatchCollator类解读
AlphaFold3 data_modules 模块的 OpenFoldBatchCollator 类将一个蛋白质样本列表中的多个字典按键合并,并对每个键值进行 torch.stack 操作,打包成一个批次(batch)。通过定义 OpenFoldBatchCollator类的 __call__ 方法,可以将类的实例当作函数来调用,相当于自定义的批次打…...
手搓多模态-06 数据预处理
前情回顾 我们目前实现了视觉模型的编码器部分,然而,我们所做的是把一张图片编码嵌入成了许多个上下文相关的嵌入向量,然而我们期望的是一张图片用一个向量来表示,从而与文字的向量做点积形成相似度(参考手搓多模态-01…...
[蓝桥杯] 求和
题目链接 P8772 [蓝桥杯 2022 省 A] 求和 - 洛谷 题目理解 这道题就是公式题,我们模拟出公式后,输出最终结果即可。 本题不难,相信很多同学第一次见到这道题都是直接暴力解题。 两个for循环,测试样例,直接拿下。 #in…...
INFINI Labs 产品更新 | Coco AI 0.3 发布 – 新增支持 Widget 外部站点集成
INFINI Labs 产品更新发布!此次更新涵盖 Coco AI 、Easysearch 等产品多项重要升级,重点提升 AI 搜索能力、易用性及企业级优化。 Coco AI v0.3 作为 开源、跨平台的 AI 搜索工具,新增快捷键设置,支持多个聊天会话等功能。Coco A…...
vue3+element-plus多个多选下拉框并搜索
一、下拉框组件: <template> <div class"top-select"> <div class"first-select"> <div v-for"(group, index) in selectGroups" :key"index" class"item-select" > <div class&quo…...
吴恩达深度学习复盘(9)多类分类与SoftMax回归
多类分类 概念 对于分类问题,并非只有0或1两个标签,而是可以有两个以上的开放标签。以手写数字分类问题为例,之前只是区分0和1, 但在实际生活中,如读取信封上的数字或邮政编码,会涉及十个可能的数字识别&…...
【力扣hot100题】(068)有效的括号
犹记得第一次做这题的时候是怎样一番惨状,现在已经得心应手了。 class Solution { public:bool isValid(string s) {stack<char> zhan;for(int i0;i<s.size();i){if(s[i]{||s[i](||s[i][) zhan.push(s[i]);else{if(zhan.empty()) return 0;if(zhan.top(){…...