新闻详情

新闻详情

首页 / 资讯中心 / 详情

Node.js+Vue3打造物业管理系统:从工单流转到支付回调实战

发布时间:2026/10/1 12:35:00来源:尧图网络
Node.js+Vue3打造物业管理系统:从工单流转到支付回调实战
做这个“智汇家园”物业管理系统起因特别朴素楼下物业还在用Excel记录报修和账单业主想查一笔物业费到底交没交得打三四个电话催。后来我干脆用 Node.js 做后端、Vue 做前端前后端分离把这套系统从零撸了出来从登录鉴权到工单流转再到缴费回调基本覆盖了一个中小型社区物业的全部日常。这个项目源码非常适合正在学前后端分离实战、想找毕设方向或者准备入职外包项目的小伙伴参考尤其是不想一上来就啃 SpringCloud 那种重框架的人。接下来我会从需求拆解、技术选型、核心实现到部署排错把整套源码的设计思路和踩坑过程一条条讲透。1. 项目定位与核心需求拆解1.1 这套系统到底在解决什么问题传统物业管理有三个老大难报修进度不透明、账单催缴靠嘴、业主信息散落在纸质台账里。业主报修漏水工单填完就不知道派给谁了物业费每月人工催收Excel 表格对账能对到崩溃门禁卡补办要翻登记本车位月租到期没人提醒。这些问题单独看都是小事串起来就是物业人员每天 80% 的无效沟通。所以这个项目的核心定位不是做一个大而全的 SaaS 平台而是做一套能落地的中小社区物业管理系统重点解决“信息流转”和“责任闭环”两个问题。源码里的模块也围绕这两个点展开业主端能在线报修、缴费、投诉、看公告物业端能派单、处理工单、生成账单、管理车位管理端则统一维护房产、业主和人员权限。从实际开发角度我最看重的是这套源码对业务状态的建模。比如工单不是简单的新增和查询而是有“待派单 → 处理中 → 待验收 → 已完结”的状态流转。账单不是手动填个数字而是根据房产面积和月单价自动生成再通过定时任务推到业主端。这种业务流程上的严谨性比单纯堆 CRUD 接口有价值得多。1.2 角色权限与功能模块全景源码里一共设计了四类角色超级管理员、物业管家、维修工、业主。每个角色看到的菜单和可操作的接口都不一样这也是很多初学者容易忽略的地方——如果所有登录用户都能调同一个接口权限就是摆设。我把核心功能模块整理成一张表方便对照源码找代码位置模块核心功能涉及角色关键技术点房产与业主管理楼栋房屋增删改查、业主绑定管理员/管家树形结构、Excel导入导出报修工单业主提交工单、管家派单、维修工处理、评价业主/管家/维修工状态机、图片上传、消息通知缴费管理物业费/水电费账单生成、在线支付、对账业主/管家定时任务、支付回调、金额精度车位管理车位租赁、到期提醒、车辆绑定业主/管家截止日期计算、广播通知公告与投诉公告发布、投诉建议、回复全体富文本、消息推送门禁车辆设备门禁记录、车辆识别回调、设备状态管理员预留硬件接入接口开发的时候不必一次把所有模块做出来。源码给我的经验是先把“房产—业主”这条基础数据链打通再在它上面挂工单和账单否则后期数据关联会一团乱麻。比如一个工单必须关联房屋编号账单必须关联业主ID这些外键关系是稳定数据模型的骨架。2. 技术选型与整体架构设计2.1 为什么后端选 Node.js 而不是 Java 或 PHP很多人一听到“管理系统”就默认用 Java Spring Boot但这个项目选 Node.js 是刻意为之原因有四个。第一前后端语言统一。后端用 JavaScript前端用 Vue 全家桶共用一套类型定义比如实体字段名、请求响应结构后端返回的 JSON 结构可以直接被前端的接口定义文件复用减少了很多跨语言对齐字段的沟通过程。第二异步 IO 非常适合物业管理这类“操作多、任务碎、并发不高但偶发批量通知”的场景。比如群发公告、批量生成账单、推送工单消息用 Node.js 的异步事件循环可以很轻量地处理不需要专门学一套并发模型。第三部署省心。生产环境只需要装一个 Node.js 运行时前端构建完扔给 Nginx后端用 PM2 挂守护进程即可不依赖 Tomcat 或 PHP-FPM。第四生态里有大量现成的中间件。Express 负责路由jsonwebtoken 做鉴权sequelize 或 prisma 做 ORMnode-cron 做定时任务socket.io 做实时推送每个环节都有成熟方案不会把时间耗在造轮子上。当然 Node.js 也有短板。比如 CPU 密集型任务视频转码、大型报表聚合表现一般但对物业系统来说这类任务几乎不存在。选型要基于业务形态而不是盲目追热点。2.2 前端为什么选 Vue 3 全家桶这个项目的前端选的是 Vue 3 Composition API Pinia Element Plus。相比 Vue 2 时期最流行的 Options API 写法Composition API 在模块复用上的优势非常明显。我举一个实际例子钱袋子金额格式化、时间格式转换、权限判断这些工具函数在 Vue 2 里容易散落在各个组件的方法中不好复用。而在项目源码里这些逻辑被统一抽成了 composables——比如usePermission、useBillSummary一个函数返回状态和方法多个页面直接调用。这种写法不仅代码更短调试时也容易定位。Pinia 状态管理的使用也抓住了关键点。全局只放 token、userInfo、menus 和未读消息数这四类数据其他页面数据都通过接口获取避免把状态仓库变成所有数据的垃圾桶。Element Plus 则基本覆盖了后台管理所需的表格、表单、弹窗、上传组件省去了大量手写 UI 的时间。移动端适配方面项目做的是响应式布局并没有单独拆一套 App。因为在真实物业场景里业主可能用微信打开 H5 页面物业管家用平板或电脑操作Vue 3 Vite 构建出来的页面能同时满足这两个入口。如果你后续要扩展成小程序这套源码的接口层完全可以复用只需新写一个前端壳子。2.3 前后端分离的目录结构与请求链路源码采用典型的前后端分离目录结构大致是这样的zhi-hui-home/ ├── server/ # Node.js 后端 │ ├── src/ │ │ ├── config/ # 数据库、JWT等配置 │ │ ├── controllers/ # 接口控制器 │ │ ├── middlewares/ # 鉴权、日志、错误处理 │ │ ├── models/ # Sequelize模型 │ │ ├── routes/ # 路由定义 │ │ └── utils/ # 工具函数、定时任务 │ └── .env # 端口、数据库连接、密钥 └── web/ # Vue 前端 ├── src/ │ ├── api/ # 接口封装 │ ├── components/ # 通用组件 │ ├── router/ # 路由配置与守卫 │ ├── stores/ # Pinia状态 │ ├── views/ # 页面 │ └── main.js └── vite.config.js请求链路从前端到后端是Vue 页面请求 → axios 实例带上 token → Vite 开发代理转发 → Express 路由 → 中间件校验 → Controller 处理 → Sequelize 查询数据库 → 返回 JSON。这里有个容易踩的坑开发环境下前后端端口不同存在跨域问题所以源码里在vite.config.js中配置了 proxy 代理。如果你直接把请求地址写成http://localhost:3000会经常遇到 CORS 报错要知道这个代理配置是开工前必须做好的事。2.4 数据库模型设计的几个关键决策数据表设计上整体遵循“基础主数据 业务流水 操作日志”三层思路。基础主数据包括user、house、owner_house业主和房屋关联表业务流水包括repair_order、bill、bill_payment、complaint操作日志记录关键行为的创建人、时间和状态变更。有两个设计细节值得特别说明。第一个是业主和房屋的关系我见过不少人直接给user表加一个house_id字段但实际业务里一个业主可能有多套房产一套房产也可能挂多个业主所以“多对多”必须用中间表owner_house来解。第二个是账单明细不要在账单主表里奢侈地存一堆冗余字段而是把费用项拆到bill_item表这样系统可以同时处理物业费、水费、车位费等多种费用类型后续新增费用项目时也不用来回改表结构。数据库统一用 utf8mb4 字符集别用 utf8否则业主姓名里的生僻字和表情符号存进去会变成乱码。金额字段坚决用 DECIMAL(10,2)不要在数据库里用 float浮点精度会让你在对账时怀疑人生。时间字段建议 DATETIME并统一存服务器时区的本地时间后端的序列化层再做一次 ISO 字符串转换避免传 Timestamp 给前端导致时区混乱。3. 核心功能模块的实操实现3.1 登录鉴权与动态路由权限前缀知识登录鉴权本质上要做两件事一是验证“你是谁”二是验证“你能访问什么”。源码采用的是 JWTJson Web Token方案用户登录成功后后端签发 token前端每次请求在Authorization头里带上 token后端用中间件解析并校验。Node.js 后端登录逻辑可以精简成下面这段const jwt require(jsonwebtoken); const bcrypt require(bcryptjs); const { User } require(../models); async function login(req, res) { const { username, password } req.body; const user await User.findOne({ where: { username } }); if (!user) return res.status(400).json({ message: 用户不存在 }); const isMatch await bcrypt.compare(password, user.password_hash); if (!isMatch) return res.status(400).json({ message: 密码错误 }); const token jwt.sign( { id: user.id, role: user.role }, process.env.JWT_SECRET, { expiresIn: 7d } ); res.json({ token, user: { id: user.id, name: user.name, role: user.role } }); }这里必须注意密码不要明文存库使用bcryptjs加盐哈希JWT 密钥放在.env里不要写死在代码中更不能提交到 Git。token 有效期设 7 天比较合理太长不安全太短又影响业主这种低频用户的使用体验。前端路由守卫是防止“输入 URL 直接跳页面”的关键。在router/index.js里全局注册beforeEach钩子每次跳转前检查 token有 token 才放行同时根据用户角色过滤菜单Vue 动态添加路由router.beforeEach((to, from, next) { const token localStorage.getItem(token); if (!token to.path ! /login) { next(/login); } else if (token to.meta.roles !to.meta.roles.includes(userStore.role)) { next(/403); } else { next(); } });如果项目里要根据角色动态生成菜单可以维护一份菜单配置标明每个菜单对应的角色和路由 name登录后从后端拉取一次。源码里菜单数据是前端固定的因为中小社区的角色也就四类硬编码反而容易维护等角色多了再考虑让后端渲染菜单树。3.2 报修工单状态机与完整流转报修工单是整个系统里最容易写乱的部分原因在于它除了增删改查还必须维护多个状态之间的转换动作。我最后采用了一套有限状态机的思路把每个状态能执行的动作限制清楚待派单业主提交后自动进入管家可以派单或驳回处理中维修工接单后进入可填写处理记录和消耗材料待验收维修工提交完工业主可确认验收或反馈未修好已完结业主验收通过工单归档同时计入维修工绩效。数据库里的状态字段我用的 ENUM 类型并加默认值pending。更新状态时后端做一次前置校验不允许跨状态跳转。比如“待派单”不能直接跳到“已完结”否则就会出现“工单还没人接就验收通过”的荒唐数据。图片上传部分源码采用的是 Node.js 的multer中间件上传目录放在服务端uploads/文件夹下请求路径通过静态资源映射暴露。这里有一个经验不要盲目把图片转成 base64 塞进数据库那会让接口请求体变得非常臃肿我实测上传一张 1MB 的照片base64 会膨胀到 1.4MB 左右MySQL 单表存储压力大增。正确做法是保存文件路径数据库中只存一个 URL。工单状态变更后要通知业主最简单的方式是在后端状态流转的接口里直接调用消息服务把“您的报修已被接单”写入message表。如果要求实时提醒就用 WebSocket 推送具体我在 3.4 节展开。3.3 物业费账单生成与支付回调物业费账单是另一个业务复杂度高地。月度账单不是手动生成而是每月 1 号定时任务自动执行查询所有owner_house关联的房产根据房型面积和费用单价计算当月金额生成bill主表记录和bill_item明细记录。定时任务我用的是node-cron在server/src/utils/cron.js中注册大家看源码时注意这一块const cron require(node-cron); // 每月1号凌晨2点生成当月账单 cron.schedule(0 2 1 * *, async () { const houses await House.findAll(); for (const house of houses) { const amount calcMonthlyFee(house.area, house.price_per_m2); const bill await Bill.create({ house_id: house.id, period: getCurrentMonth(), total_amount: amount, status: unpaid }); // 写入 bill_item例如物业费、公摊水电 } });生成完账单后业主在小程序或 H5 端支付。在线支付这块源码并没有真正部署微信支付商户号而是用一种“模拟回调”的方式把整条支付链路跑通前端点击支付后后端创建一个待支付订单并返回一个pay_token然后前端调用预支付接口后端支付回调接口先验签再更新订单状态。我把支付回调校验的逻辑单独拿出来强调// 支付回调简化示例 function verifySign(params, sign) { // 按签名规则拼接字符串再与传入sign比对 const raw ${params.amount}${params.order_no}${process.env.PAY_SECRET}; return crypto.createHash(md5).update(raw).digest(hex) sign; }实际接真实支付时不要自己发明签名逻辑必须使用微信支付/支付宝官方 SDK但流程骨架是一样的订单号唯一、回调幂等同一个回调可能发多次必须保证只更新一次、金额单位统一用“分”避免浮点数误差。3.4 公告推送与消息中心业主需要实时收到工单进展、缴费提醒、公告通知消息中心因此必不可少。最笨的方法是前端每 10 秒轮询一次接口但这会浪费服务器资源也不“实时”。源码采用socket.io做 WebSocket 推送服务端在用户登录后建立连接客户端通过事件监听接收消息。后端推送的基本思路io.on(connection, (socket) { const userId socket.handshake.auth.userId; socket.join(user_${userId}); // 当工单状态更新时对指定用户推送 io.to(user_${repairOrder.owner_id}).emit(new_message, { type: repair, message: 您的报修已进入处理中 }); });这里有一个特别容易踩的坑socket.io默认不支持多实例。如果之后用 PM2 开启了 cluster 模式两个进程之间消息没法互通必须引入 Redis adapter 来转发事件。单体部署无所谓一旦横向扩展就会出问题。我在源码里看到它没有接入 Redis所以注释里专门标注了“单机版”读者后续如果要上多实例记得先把 Redis adapter 加上。另外在开发环境WebSocket 连接也会遭遇跨域问题记得io初始化时要配置cors选项允许前端的源访问。3.5 门禁、车辆识别与硬件设备对接“智能社区”往往要对接硬件设备但真实项目中硬件厂商的协议千奇百怪有 HTTP 回调、MQTT、TCP 透传等等。源码的处理方式是抽象出一层“设备接入接口”先支持最简单的 HTTP 回调。比如门禁设备每次开门成功后会向指定回调地址 POST 一条记录{ device_id, door_id, timestamp, card_no }。后端收到后查询 card_no 对应的业主写入开门记录表并触发热点消息。车辆识别车牌同理摄像头抓拍到车牌回调接口核对车牌号和车位有效期确认后抬起道闸。这套设计的核心是“接口先定义好具体设备后面适配”。写源码时不要一开始就绑死厂商的服务否则换一个牌子的门禁就得改业务代码。接口层统一返回值具体厂商差异全部消化在适配器里这是做硬件对接的专业做法。4. 源码运行与部署环境配置4.1 Node.js 安装与环境变量配置拿到项目源码后第一步是安装 Node.js 老牌 LTS 版本建议 18.x 或 20.x。Windows 下直接官网下载 MSI 安装包安装时记得勾选“Add to PATH”macOS 建议用 Homebrew 执行brew install node20Linux 的话可以用curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -装 nodesource 源再apt-get install -y nodejs不要装 Ubuntu 自带的老版本有些旧版连 ES2020 都不完整。装完打开终端验证node -v npm -v如果打印出版本号说明安装成功。接下来还要注意 npm 全局安装路径的问题。Windows 下若设置了自定义缓存路径建议执行npm config set prefix D:\nodejs\node_global再把该路径加到系统 PATH 的用户变量里否则全局安装的pm2、vite等命令行工具会提示“不是内部或外部命令”。4.2 npm 在 PowerShell 下报错的解决办法热词里面反复出现“npm : 无法加载文件 ... npm.ps1因为在此系统上禁止运行脚本”这说明很多 Windows 新手在这步卡住了。原因不是 npm 坏了而是 PowerShell 的执行策略默认禁止运行.ps1脚本。解决方案有两种。第一种是临时放开当前会话限制Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass每次新开终端都要执行适合只是跑一下项目。第二种是永久修改当前用户的执行策略Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned执行完再npm -v就不会报红色错误了。如果你用的是 cmd 或 Git Bash则根本不会遇到这个问题。注意不要对管理员级别的 LocalMachine 执行策略乱改容易弄崩 PowerShell。4.3 数据库初始化与后端配置项目默认使用 MySQL 8.x。先建一个数据库zhi_hui_home然后执行源码自带的初始化 SQL 文件。SQL 文件里不仅建了表还插入了管理员账号、楼栋示例数据、业主与房屋关联数据建议先全部导入否则系统首页空白一片。后端配置集中在server/.envPORT3000 DB_HOSTlocalhost DB_PORT3306 DB_NAMEzhi_hui_home DB_USERroot DB_PASSyour_password JWT_SECRETplease_change_me PAY_SECRETtest_pay_secret这里有一个非常常见的问题MySQL 8 新装的用户默认使用caching_sha2_password认证插件老版本的sequelize驱动可能连不上。如果你遇到ER_NOT_SUPPORTED_AUTH_MODE需要把用户认证方式改回来ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY your_password; FLUSH PRIVILEGES;或者升级到支持新认证的驱动版本。相比之下改用mysql2客户端库会省很多事源码里用的就是mysql2。4.4 启动前端开发服务器和后端接口后端启动命令很简单进入server目录npm install npm run dev前端同理cd web npm install npm run dev默认前端跑在http://localhost:5173后端跑在http://localhost:3000。Vue 的 Vite 配置里已经配了开发代理所以前端请求/api前缀的接口都会被转发到 3000 端口不用担心跨域问题。如果启动后端时提示端口被占用用netstat -ano | findstr :3000查占用进程然后结束对应 PID。如果前端npm install特别慢八成是下载源问题执行npm config set registry https://registry.npmmirror.com切换镜像源再试速度会快很多。4.5 生产环境打包与进程守护生产部署我在实际项目中用的是“前端 Nginx 后端 PM2”的组合。前端打包cd web npm run build构建产物在web/dist目录把它上传到服务器后在 Nginx 配置里把location /根路径指向这个目录同时把/api前缀的请求反向代理到 Node.js 服务location / { root /var/www/zhi-hui-home; index index.html; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }后端用 PM2 守护进程崩溃可以自动重启npm install -g pm2 pm2 start server/src/index.js --name zhi-hui-api pm2 save注意环境变量要在pm2 start时带上去或者写一个ecosystem.config.js建议用后者配置文件比命令行参数更好维护。5. 常见问题与排查经验速查这套系统开发期间我整理了四五个高频问题很多都是初学 Node.js 和 Vue 的人绕不开的坑直接列成速查表症状原因处理方式npm 命令在 PowerShell 报“禁止运行脚本”PowerShell 执行策略限制设置 RemoteSigned 或改 cmd 执行前端接口全部 404控制台提示跨域Vite 代理没有changeOrigin检查vite.config.js的 proxy注意配置changeOrigin: true页面刷新后 404前端是 SPANginx 没有配置 try_files改用try_files $uri $uri/ /index.html上传图片后接口报 413Nginx 默认 body 大小限制 1MBNginx 配置加client_max_body_size 10mMySQL 数据库中文乱码数据库或表不是 utf8mb4建库建表指定DEFAULT CHARSETutf8mb4时间显示偏差 8 小时存储或返回时间字符串时没有统一时区数据库连接参数加timezone: 08:00返回 ISO 字符串这里单独挑两个问题详细说一下排查路径。第一个是跨域。开发环境你只要在 Vite 配置里配好 proxy就不会有跨域。但生产环境如果直接把前端打包文件放在一个没有 Nginx 的静态服务器上并且向后端 3000 端口发请求绝对会被浏览器的 CORS 策略拦截。我的习惯是前端统一走相对路径/api让 Nginx 把静态资源和接口反向代理放在同一个域名下请求头不需要加任何跨域处理。这样从源头规避 CORS比在后端写一个cors()通配中间件更安全。第二个是修改代码后页面不热更新。使用 Vite 时修改vite.config.js本身并不会自动重启需要手动重启一次开发服务器。另外如果项目目录名里带了中文字符或空格部分操作系统下 HMR 的 WebSocket 会失败我为此把项目文件夹统一改成英文名实测稳定。还有一个 Vue 相关的坑在 VS Code 里写 Vue 文件时标签无法跳转到对应组件。多半是因为没有安装最新的 Vue 语言支持插件Vue 3 项目应该装 Volar旧的 Vetur 已经不太维护了并在插件设置里关闭旧版扩展否则两个插件会打架导致跳转失效。6. 从源码到落地我的几点体会源码跑通是一回事能把这套系统真正拿到物业公司用是另一回事。我在实际部署时最大的体会是技术难点往往不在代码本身而在业务细节的抽象能力。比如“一个业主名下有两套房其中一套卖了另一套还挂着”系统要不要支持只解绑前者而保留后者再比如“物业费和车位费分开缴但业主想一次性合并支付”这需要组合支付设计。源码里的建模方式能应对大部分场景但真实世界总有边界case因此做二次开发时一定要预留扩展字段不要为了省事把所有信息都硬编码。我后来重新审视这个项目最后悔没做的一件事是“数据权限”的精细化。初版只做了菜单权限不同角色能看到不同页面但同一个物业管家登录后理论上不应该能看所有小区所有楼栋的数据。如果项目要支持多小区运营就得上data scope数据权限体系按小区或楼栋过滤数据。这个改造牵扯到每个查询接口和前端列表数据源成本相当高。如果你是想基于这套源码做毕设或者二次开发我建议一开始就把community_id字段加到主要业务表里哪怕当前只有一个小区空着也比后来补要轻松得多。最后聊一个大家都会关心的点这套系统的可扩展方向。可以把它接到微信小程序业主就不用打开 H5 而是直接在小程序里报修缴费接口几乎不用动也可以做一个运营数据大屏用 ECharts 呈现工单流转环节耗时、缴费率、投诉热区等指标这是给甲方展示时最容易出彩的模块甚至可以在门禁对接后用消息推送让业主远程开门把“物业系统”升级成真正的“智慧社区入口”。我后来在自己的项目里沿着这几个方向陆续加了功能收益都很明显。如果你正准备拿这套源码练手建议先按部署文档把环境跑起来再多读几遍工单和账单这两条核心链路的代码理解状态流转和数据闭环后再谈扩展才有底气。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

不写后端也能做应用分发:用对象存储搭建ESP32的OTA固件市场 2026/10/1 15:49:31

不写后端也能做应用分发:用对象存储搭建ESP32的OTA固件市场

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

阅读更多 →
为什么你还需要CompozyOS:AI Agent编排框架CompozyOS解决的7大难题 2026/10/1 15:49:24

为什么你还需要CompozyOS:AI Agent编排框架CompozyOS解决的7大难题

为什么你还需要CompozyOS:AI Agent编排框架CompozyOS解决的7大难题 【免费下载链接】compozy An operating system for AI agents. Plug in the agent CLIs you already use (Claude Code, Codex, Gemini CLI, Cursor) and they become a team: they split the work…

阅读更多 →
九月日志与链路追踪总决算:构建极速、轻量、高可用数据大动脉 2026/10/1 15:49:24

九月日志与链路追踪总决算:构建极速、轻量、高可用数据大动脉

九月日志与链路追踪总决算:构建极速、轻量、高可用数据大动脉在 2026 年 9 月 30 日这个属于全体数据与 SRE 架构师的辉煌收官之日,专栏【T3 日志与追踪】迎来了整整一个月的全面总决算。 回顾这整整 30 个日日夜夜,全站日志与全链路追踪基础…

阅读更多 →
基于Python+TensorFlow 2.3实现花卉识别系统:从数据到实时演示 2026/10/1 15:49:24

基于Python+TensorFlow 2.3实现花卉识别系统:从数据到实时演示

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

阅读更多 →
XGBoost原理推导与调参实战:从目标函数到分裂增益 2026/10/1 15:49:24

XGBoost原理推导与调参实战:从目标函数到分裂增益

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

阅读更多 →
反过度设计月度总结:消灭一万行无用代码 2026/10/1 15:49:18

反过度设计月度总结:消灭一万行无用代码

反过度设计月度总结:消灭一万行无用代码在整个九月的“反过度设计(Anti-Overengineering)”专栏中,我们向软件工程中泛滥的形式主义与虚荣设计发起了持续的猛烈进攻:从批判空 Service 转发层、到拔掉多级缓存、再到淘汰…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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