新闻详情

新闻详情

首页 / 资讯中心 / 详情

Django全屋定制系统毕设实战:业务设计到避坑全攻略

发布时间:2026/10/1 15:33:44来源:尧图网络
Django全屋定制系统毕设实战:业务设计到避坑全攻略
每年到这个时间点总有不少同学在毕设选题上纠结。选电商系统吧烂大街选图书管理吧答辩老师看一眼就没兴趣。而“家居全屋定制系统”这个方向结合了当下家居行业数字化转型的热点业务逻辑足够丰富技术实现上又能覆盖Django框架的大部分核心知识点属于一个“既有得聊又好落地”的题目。这篇博文就围绕这个毕设项目从选题拆解、技术选型、数据库设计、核心功能实现到实战过程中容易踩的坑一次性讲清楚。内容偏实操向写代码、讲原理、给配置适合正在做同类项目的同学参考也适合打算用Django做Web开发入门的读者收藏。1. 项目定位这套“家居全屋定制系统”到底在解决什么问题1.1 全屋定制业务的真实链路与系统切入点做系统之前先得搞清楚业务是怎么跑的。全屋定制不像普通电商那样“看中就下单”它的完整链路是线上浏览产品案例 → 预约设计师 → 上门量尺 → 出设计方案 → 报价确认 → 签订合同 → 工厂生产 → 配送安装 → 售后回访。这里面的核心痛点是信息断链。销售在微信里聊的报价和设计师出的方案经常对不上客户的订单进入生产环节后进度靠人工打电话去问管理者想统计某个月的订单量、各类板材的使用占比只能翻Excel。系统要解决的就是把这些割裂的环节放在同一个平台上让用户看得到、设计师改得动、管理员管得住。所以这套系统的切入点不是做一个花哨的展示网站而是围绕“预约、量尺、方案、报价、订单、进度”这条业务主链做数字化闭环。对毕设来说这个业务宽度刚好合适既有C端的注册登录、产品浏览又有B端的订单审核、派单管理、进度更新比单纯做个商城有延展性。1.2 三类用户角色决定了模块划分系统里的用户至少分成三类普通用户业主、设计师、平台管理员。角色的不同决定了功能模块的划分方式。普通用户关注的是浏览家居风格案例、查看产品详情、提交预约量尺申请、查看方案和报价、下单、追踪订单进度。设计师关注的是接收分配的量尺任务、录入量尺数据、上传设计方案、调整报价明细、更新订单状态。管理员关注的是管理用户、审核商品和案例内容、分配量尺订单给指定设计师、查看经营数据订单量、销售额、各状态订单数量。角色之间不是完全隔离的。比如设计师更新了方案用户端能实时看到状态变化管理员分配了量尺任务设计师后台就多出一条待办。这个“角色操作引发另一角色可见变化”的联动正是整个系统业务逻辑的核心也是答辩时最能展开讲的部分。1.3 为什么全屋定制比普通商城更适合做毕设我的看法是普通电商系统已经被做烂了很难做出差异化。而全屋定制系统天然带几个特殊点第一业务链路长从浏览到售后有完整生命周期展示在论文里可以画业务流程图。第二报价逻辑有深度不是简单的“单价乘数量”而是按投影面积、展开面积、材料等级、五金件数量等组合计算这比普通商品加购物车有技术含量。第三行业背景新家居行业这几年在讲数字化、整装、拎包入住选题不容易撞车答辩老师也更容易认可这个方向的价值。2. 技术选型拆解为什么Django能把这类系统做得又快又稳2.1 Django自带的东西比你想象的多选Django最大的理由不是“课上教了这个”而是它自带的组件契合这类业务系统能省掉很多重复造轮子的时间。Django默认就带后台管理Admin只需要在admin.py里注册模型几分钟就能得到一个能对用户、商品、订单做增删改查的管理后台作为系统的“内部管理端”完全够用。它自带认证系统注册、登录、登出、密码修改、权限分组几行配置就能跑起来。它还自带表单验证、CSRF防护、分页、消息提示这些看起来不起眼但都是业务系统离不开的“地基”。这些能力叠加起来意味着开发者的主要精力可以放在业务逻辑上而不是去实现“用户怎么登录”“表单怎么校验”这些基础能力。对毕设来说这直接决定了你还有时间改bug、写论文、做PPT。2.2 Django ORM处理订单、方案、商品关系的天然优势全屋定制系统里数据关系复杂比如一个订单包含多个商品明细每个明细关联一个产品一个量尺记录关联一个订单和一个设计师一个方案里可能选中了多个产品品类。这种多对一、多对多的关系模型用Django的ORM处理起来非常自然。比如定义好了外键查询某个订单关联的全部商品明细时一行“订单对象.明细对象_set.all()”就能拿到需要反查某个用户的所有订单也是同样的简写。ORM在背后帮我们完成了SQL的生成和结果集的映射只要模型设计合理90%的业务查询不需要手写SQL。更重要的是Django的ORM支持事务这对订单创建这类“必须保证一致性”的操作很关键。下单时可能存在头表数据订单和明细表数据订单商品要同时写入的情况一个操作失败满盘回滚避免出现“订单保存了但明细丢了”这种脏数据。这部分在后期调试和论文写作中都是加分项。2.3 技术栈的补充建议数据库和前端怎么搭配Django默认使用SQLite对毕设来说如果你的项目数据量不大本地开发直接用SQLite完全没问题部署也简单就是一个文件。但有几个注意点SQLite对并发写操作的锁处理较弱如果演示时多个用户同时提交订单偶尔会出现“database is locked”的报错另外有些字段类型和MySQL有细微差别比如布尔值存储方式不同。如果想让项目显得更“企业级”我建议切换成MySQL开发和生产保持一致。操作不复杂安装pymysql在项目的init.py里加两行补丁然后修改settings.py里的数据库配置就行。前端方面纯Django模板语法加Bootstrap是性价比最高的方案不需要前后端分离开发速度快如果自己Vue比较熟也可以选择Django提供API接口、前端用Vue渲染的方案但工作量会大不少答辩时间紧的话不建议冒险。3. 数据库设计与核心模型先想清楚数据怎么串起来3.1 用户模型扩展Django内置User还是直接重写设计数据库的第一步就是处理用户。Django内置的User模型已经带了用户名、密码、邮箱、姓名等字段而且和认证系统、Admin后台深度绑定能用就不要自己重写。但内置User只有普通字段我们需要区分“普通用户”和“设计师”这时候有两种做法。第一种通过一对一关联扩展用户信息表这种方式不动Django的User只建一张profile表跟User做一对一外键关联里面放手机号、用户类型、所属设计师等级等额外字段查询时通过“user.profile”访问。第二种用Django的AbstractUser重写User模型在settings里配置AUTH_USER_MODEL指向自定义模型加一个user_type字段登录注册逻辑也多走一套自定义认证。考虑到毕设的演示场景和少踩坑原则我更推荐一对一扩展方案。它既保留了Django认证系统的完整能力又不需要在一开始就定义好全部用户字段后续要加字段随时在profile表里加。3.2 商品与方案模型把“定制”变成可计算的对象家居全屋定制的商品不是“一个柜子卖多少钱”而是“柜子的投影面积乘以单价加上抽屉、五金件、特殊工艺的费用”。所以商品模型要同时满足展示和计价两种需求。我的设计思路是这样的建立一个产品分类表如衣柜、橱柜、电视柜、榻榻米再建产品表产品表除了基本信息还需要包含计价方式相关的字段比如单价的单位、是否支持按投影面积计算、是否支持定制尺寸。核心模型大致这样class ProductCategory(models.Model): name models.CharField(分类名称, max_length50) parent models.ForeignKey(self, blankTrue, nullTrue, on_deletemodels.CASCADE, verbose_name父级分类) sort models.IntegerField(排序, default0) class Meta: verbose_name 产品分类 verbose_name_plural verbose_name def __str__(self): return self.name class Product(models.Model): PAY_MODE_CHOICES ( (1, 按件计价), (2, 按投影面积计价), (3, 按展开面积计价), ) name models.CharField(产品名称, max_length100) category models.ForeignKey(ProductCategory, on_deletemodels.PROTECT, verbose_name所属分类) cover models.ImageField(封面图, upload_toproduct/, blankTrue) price models.DecimalField(基准价, max_digits10, decimal_places2) pay_mode models.SmallIntegerField(计价方式, choicesPAY_MODE_CHOICES, default1) material models.CharField(材质说明, max_length200, blankTrue) is_active models.BooleanField(是否上架, defaultTrue) created_at models.DateTimeField(创建时间, auto_now_addTrue)这里有几个细节值得注意。外键用“on_deletemodels.PROTECT”而不是默认的CASCADE因为产品分类被删除时不应该把整个商品全部连带删掉而是应该禁止删除并提示先去处理商品这在业务上更安全。机械Model字段用DecimalField不用FloatField因为金额计算如果用浮点数会出现0.1加0.2不等于0.3这类精度问题而DecimalField精确到分报价计算才不会出错。3.3 订单模型与状态流转设计订单是这套系统的核心下单、支付、量尺、制作、安装、完成每个环节都要有据可查所以订单模型要带状态字段和订单编号。class Order(models.Model): STATUS_CHOICES ( (0, 待支付), (1, 待分配量尺), (2, 待上传方案), (3, 方案待确认), (4, 待生产), (5, 安装中), (6, 已完成), (7, 已取消), (8, 售后中), ) order_no models.CharField(订单编号, max_length32, uniqueTrue) user models.ForeignKey(User, on_deletemodels.CASCADE, verbose_name下单用户) designer models.ForeignKey(User, blankTrue, nullTrue, on_deletemodels.SET_NULL, related_namedesigner_orders, verbose_name负责设计师) status models.SmallIntegerField(订单状态, choicesSTATUS_CHOICES, default0) total_amount models.DecimalField(订单总金额, max_digits12, decimal_places2) address models.CharField(收货地址, max_length255) remark models.CharField(用户备注, max_length255, blankTrue) created_at models.DateTimeField(下单时间, auto_now_addTrue) updated_at models.DateTimeField(更新时间, auto_nowTrue)订单编号不要用自增ID直接展示因为自增ID会暴露订单量而且位数不统一。我习惯用“当前日期随机数”生成规则可以是这样取当天年月日再加6位随机数字在创建订单时校验唯一性冲突就重新生成。这个细节很小但论文里可以写上“订单编号采用日期加随机数策略保证高并发下不重复”也算一个亮点。订单状态字段用SmallIntegerField加choices而不是存字符串好处是有明确的数值顺序后期做筛选和统计更方便。比如统计当前“待生产”状态的订单一行过滤就能出来。3.4 扩展模型量尺记录与施工进度订单不是下了就完了接下来要到线下量尺再出方案。这个环节在数据库里要有记录不然订单状态流转就会变成“拍脑袋改状态”没有数据支撑。量尺记录表关联订单和设计师存量尺日期、量尺地址、房间尺寸数据、现场备注。设计师上传方案之后方案文件、方案说明、报价明细也要单独建表存。施工进度可以做成一个进度记录表每完成一个阶段就插入一条记录前端按时间线展示用户就能看到订单走到哪一步了。这几个扩展模型在论文的业务流程设计章节里作用很大它们把“系统只管理订单信息”提升到了“系统管理整个服务流程”的维度答辩时讲业务完整性就有底气了。4. 核心业务功能实现报价、购物车、权限与订单流转4.1 在线报价投影面积计价逻辑的实现报价是全屋定制系统最核心的亮点功能写明白这一块答辩就已经成功了一半。先理清计价规则。以一个衣柜为例常见做法是投影面积计价衣柜的宽乘以高得到投影面积然后乘上单价超出标配部分抽屉、加长配件、特殊五金再额外加钱。这套规则落到代码里关键是“面积计算”和“附加项计算”分离不要全塞到一个函数里。我的实现思路是建立一个报价对象客户选择完产品、填写宽高尺寸、勾选附加项后后台实时计算并返回总价。核心代码大概长这样def calc_cabinet_price(width, height, unit_price, addons_amount0, rate1.0): 按投影面积计算柜体价格 width: 宽度(米) height: 高度(米) unit_price: 套餐单价(元/平方米) addons_amount: 附加件总价 rate: 材料等级系数如实木多层板为1.2颗粒板为1.0 area width * height base area * unit_price * rate return round(base addons_amount, 2)这里有个容易忽略的点尺寸单位。用户页面输入的一般是毫米比如衣柜宽2400毫米高2600毫米如果不转换直接用算出来的面积会大得离谱。所以前端输入毫米后端先除以1000转成米再参与计算。这个单位转换的细节是调试报价功能时最高频的bug来源也是代码讲解时可以重点提的一个坑。4.2 购物车与订单提交流程购物车的实现有会话方案和数据库方案两种。会话方案用request.session存商品列表简单快速但用户换设备就丢数据库方案建一张购物车表存用户和商品的关系体验更好也不会丢。我倾向于数据库方案因为毕业设计要展示的是“完整体验”而且数据库方案在论文里能多画一张数据表内容更充实。购物车表不复杂关联用户、关联商品、记录数量、记录加入时间。加购和修改数量都是常规增删改查不多说。提交流程就需要认真设计了关键点在于“事务”。因为创建订单时要同时写入订单主表和订单明细表明细有多条时任何一条写入失败都会导致数据对不上。from django.db import transaction from django.utils import timezone transaction.atomic def create_order(user, cart_items, address, remark): order_no generate_order_no() total sum(item.product.price * item.quantity for item in cart_items) order Order.objects.create( order_noorder_no, useruser, total_amounttotal, addressaddress, remarkremark, status0 ) for item in cart_items: OrderItem.objects.create( orderorder, productitem.product, quantityitem.quantity, priceitem.product.price, subtotalitem.product.price * item.quantity ) item.delete() # 下单成功后清空购物车这些条目 return order用“transaction.atomic”装饰器包住整个操作任何一个环节出问题都会自动回滚。这个操作在文档里一定要写清楚它是保证订单数据一致性的关键。总价计算这里还有一个细节涉及商品单价、订单明细单价、订单总金额至少要三个字段都存一份。因为商品价格以后可能调整但历史订单的单价不能跟着变。这就是所谓的“快照”思想写论文时值得展开讲。4.3 权限控制与状态流转的落地Django的认证系统已经处理了“登录状态”这件事但“不同角色能做什么”还需要自己控制。最简单的方案是装饰器加用户类型判断。from functools import wraps from django.http import JsonResponse def require_role(*roles): def decorator(view_func): wraps(view_func) def _wrapped(request, *args, **kwargs): if not request.user.is_authenticated: return JsonResponse({code: 403, msg: 请先登录}) if request.user.profile.user_type not in roles: return JsonResponse({code: 403, msg: 无权操作}) return view_func(request, *args, **kwargs) return _wrapped return decorator这个装饰器用起来很顺手设计师端接口标“require_role(2)”管理员端标“require_role(3)”普通操作标“require_role(1, 2, 3)”。它比到处写if判断更清晰也更方便后期维护。订单状态流转要遵循一个原则状态只能按顺序流转不能跳着改更不能倒着退。比如“待分配量尺”只能变成“待上传方案”不能直接变成“已完成”。我实现的方式是定义一个状态机映射表STATUS_FLOW { 0: [1], # 待支付 - 待分配量尺 1: [2], # 待分配量尺 - 待上传方案 2: [3], # 待上传方案 - 方案待确认 3: [4, 7], # 方案待确认 - 待生产 / 已取消 4: [5], 5: [6], }每次更新订单状态先判断当前状态和目标状态的关系是否在映射表里不在就直接拒绝。这样做能防止数据被随意篡改也符合业务真实流程。答辩时如果老师问“用户能不能取消订单”你就可以说取消只允许在“方案待确认”之前操作进入生产流程后订单不可自行取消需要联系客服走售后流程这里体现的正是业务上的控制逻辑。5. 从0到1实操过程实录环境搭建、项目生成与联调5.1 创建项目与基础配置按照毕业设计的常规路径第一步是创建虚拟环境、安装Django。接着创建项目和应用我建议把所有业务功能集中到一个应用里比如叫“main”或者“app”不要拆成五六个应用。毕设项目不是企业级微服务拆得太细反而增加管理成本。基础配置层面重点关注这几个地方# settings.py 里需要调整的核心配置 INSTALLED_APPS [ # ... django.contrib.humanize, # 模板里做数字格式化 app, # 核心业务应用 ] # 数据库切换为 MySQL 时的配置 DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: home_decor, USER: root, PASSWORD: your_password, HOST: 127.0.0.1, PORT: 3306, OPTIONS: {charset: utf8mb4}, } } # 时区设置建议保留本地时区而非 UTC TIME_ZONE Asia/Shanghai USE_TZ True时区这地方最容易踩坑。如果USE_TZ保持True不设置TIME_ZONEDjango创建的数据是UTC时间和北京时间差8个小时前端展示“下单时间”时会看到比实际时间晚8小时的诡异情况。我建议把TIME_ZONE设为“Asia/Shanghai”时间显示就正常了。5.2 模板与静态文件组织前端页面的组织方式也有讲究。不要每个页面都写一套完整HTML而是做一个基础模板把公共部分头部导航、页脚、CSS样式引用抽出来子页面通过模板继承重写中间的内容块。Django的模板继承语法很简单基础模板里写好“{% block content %}”子页面用“{% extends base.html %}”加“{% block content %}...{% endblock %}”填充自己的内容。这样首页、商品列表页、订单详情页的公共框架只写一遍后面改导航栏只需要动一个文件。静态文件图片、CSS、JS放在应用的static目录里在模板中用“{% load static %}”加载。这里有一个我见过无数人卡住的问题本地开发时改了CSS浏览器刷新永远是旧样式。这不是代码错了而是浏览器缓存了静态文件。解决办法是刷新时按住CtrlF5强制刷新或者在CSS文件后面加版本参数比如“style.css?v20250101”。5.3 管理后台定制让Admin更好用Django自带Admin后台是默认的管理端但直接裸用体验很差。我建议花一点时间定制主要是设置列表页展示的字段、可搜索字段和筛选器。from django.contrib import admin from .models import Product, Order admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display (name, category, price, pay_mode, is_active, created_at) list_filter (category, pay_mode, is_active) search_fields (name,) list_editable (is_active,) admin.register(Order) class OrderAdmin(admin.ModelAdmin): list_display (order_no, user, status, total_amount, created_at) list_filter (status,) search_fields (order_no, user__username) date_hierarchy created_at这里的“search_fields (order_no, user__username)”是Django Admin里的一个常用技巧用双下划线跨表关联搜索用户名字段注册的时候就可以直接按用户名找订单。这种“双下划线语法”不仅是Admin定制在整个ORM查询里都通用写论文时务必写进关键技术点。6. 常见问题速查与避坑技巧6.1 我见过最多人踩的坑做这类系统我用亲身经验总结出了一份高频问题速查表。每一个都对应过一次血泪调试经历建议直接存下来备用。现象原因解决办法页面加载后CSS/图片全丢settings.py没配置STATICFILES_DIRS或DEBUG模式下静态文件未托管开发环境确认用“python manage.py runserver”配置静态文件路径提交表单报CSRF token missing表单里没加“{% csrf_token %}”所有POST表单模板中加CSRF标签数据库迁移报字段冲突改model后没有生成新的迁移文件执行“makemigrations”和“migrate”图片上传后访问404MEDIA_URL和MEDIA_ROOT没配置或没在urls.py里加静态服务配置MEDIA路径DEBUG模式下用“static()”辅助函数订单金额算出来是一长串小数计算用了FloatField而不是DecimalField浮点精度问题金额字段统一用DecimalField计算用Decimal北京时间显示差8小时TIME_ZONE未设置或USE_TZ逻辑不对设置“TIME_ZONEAsia/Shanghai”删除分类时商品被连带删除外键用了on_deleteCASCADE业务外键优先用PROTECT或SET_NULL页面提示“column does not exist”修改了模型字段但数据库没同步执行迁移或小规模时直接重建开发库表单CSRF那个问题尤其常见很多同学第一次写注册页就卡在403上。记住一个原则只要HTML表单的method是POST就必须在form标签内部加“{% csrf_token %}”这是Django默认开启的安全机制也是面试官喜欢问的一个点。6.2 查询性能优化别让ORM拖垮首页数据量不大的时候ORM怎么写都很快但到了答辩演示如果商品表有几百条、订单表有几千条不注重查询性能就可能出现列表页卡顿。最常见的性能坑是“N1查询”。比如在模板里循环显示订单列表每显示一个订单还要通过外键去查一次用户名页面加载一次可能触发几十次数据库查询。解决办法是在视图里用select_related针对一对一、多对一外键或者prefetch_related针对多对多、反向查询一次性把关联数据取出来。# N1 查询每次循环都查一次用户 orders Order.objects.all() # 优化后一条SQL把订单和用户关联数据一起查出来 orders Order.objects.select_related(user).all()用“django-debug-toolbar”这个工具能看到页面执行了多少条SQL把工具栏面板打开再访问列表页如果SQL条数超过列表条数那基本就是N1问题。这个工具放进去调试一遍论文里还可以截图展示优化前后的查询次数对比非常加分。6.3 代码讲解与毕设文档如何配合做毕业设计最怕的是“程序跑起来了但讲不清楚”。代码讲解不要求一行一行念关键是能把“为什么这样设计”讲明白。我的建议是准备三块内容。第一一个业务流程图从用户下单到收货把每一步对应到系统的哪个视图函数、哪个模型、哪个状态变化都标出来。第二一个模型关系图画出User、Order、OrderItem、Product、ProductCategory之间的关系讲清楚每个外键的用途。第三准备2到3个核心函数的逐行讲解推荐优先准备报价计算、下单事务、权限装饰器这三块。文档写作上重点写需求分析和数据库设计。需求分析里的用例图可以按角色画用户能做什么、设计师能做什么、管理员能做什么一一对应数据库设计里要把表的字段写全特别注明主外键、数据类型、是否为空、默认值。这些内容写充实了论文主体自然就丰满了。回到标题本身“程序文档代码讲解”的模式其实是一个很好的学习路径先跑通程序再读文档理解设计最后通过代码讲解深入细节。如果你是自己做毕设也建议用同样的顺序推进先实现核心流程再完善文档最后准备讲解这样的产出才是完整可验收的。最后说点实在的。做这种带业务流程的系统最容易翻车的地方不是某个技术难点而是业务逻辑没有闭环。下单之后状态不流转、设计师改了方案用户端没提示、管理员分配了任务设计师端看不到这些问题在开发前期很难发现等联调的时候才暴露就很被动。我的建议是先把订单状态流转图在纸上画出来再动手写代码哪里断了补哪里系统跑通的那一刻你会觉得这门课没白上。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

铝型材阳极氧化技术的发展与应用 2026/10/1 16:12:14

铝型材阳极氧化技术的发展与应用

铝型材阳极氧化技术的发展与应用一、前言由于铝及铝合金产品具有一系列优良的化学、物理、力学加工性能和特征,使铝及铝合金制造工业得以迅猛发展,在国民经济各部门中无不大量使用铝及铝合金产品。然而,铝合金材料表面硬度低、耐磨性差、耐腐…

阅读更多 →
组合数学入门书籍(2026.09) 2026/10/1 16:12:14

组合数学入门书籍(2026.09)

1、奥数教程 七年级(第八版)套装(教程能力测试学习手册) 2、奥数经典500例 计数(精华版) 3、奥数经典500例 计数 4、组合数学300题(2026.03) 5、母函数(第2版 典藏版) 6、初中数学竞…

阅读更多 →
SEMA按需生长机制:让预训练模型持续扩展而不遗忘 2026/10/1 16:12:07

SEMA按需生长机制:让预训练模型持续扩展而不遗忘

上个月我把一个训练好的视觉模型部署到产线上,跑了两周一切正常。结果新来的合作方提了一批新需求——识别类别多了三分之一,而且某些样本的形态和训练集完全不是一个路数。当时我面临一个很现实的选择:换一个更大的预训练模型重训&#xff0…

阅读更多 →
软件测试简历包装:从十秒初筛到面试追问的实用指南 2026/10/1 16:12:07

软件测试简历包装:从十秒初筛到面试追问的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
HSV与HSL颜色空间全解析:从原理到图像识别实战 2026/10/1 16:12:07

HSV与HSL颜色空间全解析:从原理到图像识别实战

做图像处理这几年,我踩过最不值当的坑,就是拿RGB通道直接去识别颜色。有一回做一个交通信号灯的识别demo,代码逻辑简单得不能再简单——红灯就判断R通道大于150、G和B小于100。中午在实验室测得好好的,跑到傍晚的十字路口&#xf…

阅读更多 →
Java OBS 对象存储同名文件覆盖排查:文件名唯一性方案与源码分析 2026/10/1 16:12:07

Java OBS 对象存储同名文件覆盖排查:文件名唯一性方案与源码分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉