首页/新闻资讯/正文详情

基于JavaWeb与MySQL的小区物业管理系统:从Excel台账到可运行工程

发布时间:2026/9/26 17:13:45 来源:云帆数科 栏目:资讯中心
基于JavaWeb与MySQL的小区物业管理系统:从Excel台账到可运行工程
简介这份资源是一套基于JavaWeb与MySQL的小区物业管理系统完整源码面向正在学习Java Web开发、需要课程设计或毕业设计参考的在校学生与初级开发者。项目采用MVC分层架构前端基于BootStrap实现响应式布局后端涵盖用户注册登录、验证码校验、邮件工具、水电费与车辆管理费查询、社区活动通知浏览等模块数据库结构经过规范化设计适合用来理解业务逻辑、数据访问与展示层的分离思路。压缩包共873个文件约68.34MB以js脚本、jpg与png图片、css及scss/less样式、jsp页面、java源码与class字节码、jar依赖包为主另含sql建库脚本与properties配置文件目录结构清晰便于按模块检索与二次开发。目前已有31人学习下载。读者可从中获得一套可直接部署运行的物业管理系统参考实现对照源码梳理Servlet与Service调用链、验证码与邮件工具类的封装方式并借助数据库脚本快速还原表结构与测试数据为课程作业或项目练手提供完整范例。1. 小区物业管理系统从一张Excel台账到能跑起来的JavaWeb工程物业前台最怕的不是业主投诉而是月底对账时发现三本台账对不上Excel里记的停车费、纸质登记本上的物业费、微信群里口头承诺的减免最后全压在一个人身上手工核对。基于JavaWeb与MySQL的小区物业管理系统要解决的就是把收费、报修、住户档案、车位这几件事从散落的表格里收进一个Web后台让前台、维修工、管理员看到同一份数据。这套东西适合两类人一是做课程设计或毕业设计、需要一套完整案例把JSP/Servlet/MyBatis串起来的学生二是中小物业公司里懂点技术、想自己搭一套内部工具的人。它不追求高并发追求的是业务闭环清楚、部署门槛低、源码能看懂能改。下面按选型、建库、后端、前端、排错、进阶的顺序把一套能落地的实现讲透。2. 技术选型与工程骨架为什么是JSPServletMyBatis而不是一上来就SpringBoot2.1 先想清楚这套系统要跑在什么环境里小区物业系统的真实运行环境往往很朴素一台放在办公室的旧电脑或者物业公司租的一台低配云主机内存4G、CPU两核装的是Windows Server或者某个国产Linux发行版。这种环境下选型的第一原则不是先进而是依赖少、启动快、出问题能自己查。SpringBoot确实开发效率高但它把Tomcat、自动配置、依赖注入全打包进来一个空项目启动就要占几百兆内存对于只需要支撑几十个住户、并发不超过20的物业系统来说属于用大炮打蚊子。更现实的问题是很多做课程设计的人对SpringBoot的自动配置机制并不真正理解出了问题只能靠搜索引擎碰运气而JSPServlet的请求响应链路是显式的每一步都能打断点看到。常见做法是分层表现层用JSP负责渲染控制层用Servlet接收请求和做参数校验业务层用Service类封装收费计算和报修流转逻辑持久层用MyBatis操作MySQL。这个组合的好处是每一层职责清晰新手能顺着一个请求从浏览器一路跟到SQL。JDK选8或者11都行Tomcat选8.5或9.0MySQL选5.7或8.0这几个版本互相兼容性最好网上资料也最全。IDE用IDEA社区版就够注意社区版对JavaWeb的支持需要手动配置Tomcat和Artifact这一点后面会讲。2.2 工程目录结构一个能直接导入IDEA的骨架一个规范的JavaWeb工程目录长这样照着建不会乱property-management/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/community/ │ │ ├── controller/ # Servlet控制器 │ │ ├── service/ # 业务逻辑 │ │ ├── dao/ # MyBatis Mapper接口 │ │ ├── entity/ # 实体类 │ │ └── util/ # 数据库工具、日期工具 │ ├── resources/ │ │ ├── mybatis-config.xml # MyBatis主配置 │ │ ├── mapper/ # SQL映射XML │ │ └── db.properties # 数据库连接参数 │ └── webapp/ │ ├── WEB-INF/ │ │ ├── web.xml # 部署描述符 │ │ └── views/ # JSP页面 │ ├── static/ # css/js/图片 │ └── index.jsp └── pom.xml # Maven依赖这个结构里resources和webapp分开是关键前者打包进classpath后者是Web资源根目录。很多人把JSP放在src/main/java下面结果Tomcat找不到这是新手最常见的翻车点之一。用Maven管理依赖pom.xml里至少要有servlet-api、jsp-api、mybatis、mysql-connector-java、jstl这几个。注意servlet-api和jsp-api的scope要设成provided因为Tomcat自带打进war包反而会冲突。2.3 数据库连接与MyBatis配置把参数抽出来数据库连接信息不要硬编码在Java里抽到db.propertiesjdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/community_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse jdbc.usernameroot jdbc.passwordyour_password这里有几个参数必须解释。serverTimezoneAsia/Shanghai是MySQL 8.0之后必须加的不加会报时区错误这是血泪经验。useSSLfalse在本地开发时关掉避免SSL连接错误生产环境再按需开启。characterEncodingutf8保证中文不乱码配合建库时的utf8mb4字符集使用。MyBatis主配置mybatis-config.xml负责加载properties、注册Mapper、开启驼峰映射?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration properties resourcedb.properties/ settings !-- 数据库下划线字段自动映射到Java驼峰属性 -- setting namemapUnderscoreToCamelCase valuetrue/ setting namelogImpl valueSTDOUT_LOGGING/ /settings environments defaultdevelopment environment iddevelopment transactionManager typeJDBC/ dataSource typePOOLED property namedriver value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /dataSource /environment /environments mappers mapper resourcemapper/OwnerMapper.xml/ mapper resourcemapper/FeeMapper.xml/ mapper resourcemapper/RepairMapper.xml/ /mappers /configurationmapUnderscoreToCamelCase打开后数据库的owner_name会自动映射到实体类的ownerName省掉大量resultMap配置。logImpl设成STDOUT_LOGGING开发阶段能把执行的SQL打印到控制台排查问题时不用猜。dataSource用POOLED连接池MyBatis自带的池够用不需要额外引入Druid或HikariCP少一个依赖少一个坑。提示db.properties里的密码不要提交到公开仓库本地开发用测试密码部署时通过环境变量或外部配置文件覆盖。3. 核心业务表设计与收费逻辑住户、车位、账单怎么串起来3.1 四张核心表撑起整个业务物业系统的数据模型不复杂但字段设计要考虑实际业务。下面四张表是必须的表名用途关键字段owner住户档案id, name, phone, room_no, building_no, check_in_dateparking车位信息id, space_no, owner_id, status, monthly_feefee_bill费用账单id, owner_id, bill_type, amount, bill_month, status, pay_timerepair_order报修工单id, owner_id, content, status, create_time, finish_time建表时几个细节要注意。owner表的room_no和building_no分开存不要合成一个3栋2单元501的字符串否则按楼栋统计时要用字符串截取SQL会很难写。fee_bill表的bill_month用varchar(7)存2025-01这种格式比用date类型好处理因为物业费是按月收的不需要精确到日。status字段用tinyint0表示未缴、1表示已缴、2表示部分缴纳比用字符串省空间也快。CREATE TABLE owner ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) NOT NULL, phone VARCHAR(16), building_no VARCHAR(8) NOT NULL, room_no VARCHAR(16) NOT NULL, check_in_date DATE, UNIQUE KEY uk_room (building_no, room_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE fee_bill ( id INT PRIMARY KEY AUTO_INCREMENT, owner_id INT NOT NULL, bill_type TINYINT NOT NULL COMMENT 1物业费 2停车费 3水费, amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, bill_month VARCHAR(7) NOT NULL, status TINYINT NOT NULL DEFAULT 0, pay_time DATETIME, KEY idx_owner_month (owner_id, bill_month) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;amount用DECIMAL(10,2)而不是float金额计算不能用浮点数这是铁律。uk_room唯一索引防止同一房间重复录入。idx_owner_month联合索引让查某住户某月的账单走索引数据量大了也不慢。3.2 收费计算一个Service方法讲清楚物业费的计算逻辑是根据住户的房屋面积乘以单价再按月份生成账单。停车费则是根据车位绑定的月租直接生成。下面是一个生成月度账单的Service方法public int generateMonthlyBill(String billMonth) { // 1. 查出所有在住住户 ListOwner owners ownerMapper.selectAllActive(); int count 0; for (Owner owner : owners) { // 2. 检查该月物业费账单是否已存在避免重复生成 FeeBill exist feeMapper.selectByOwnerAndMonth(owner.getId(), billMonth, 1); if (exist ! null) { continue; } // 3. 按面积计算物业费单价从配置读取 BigDecimal unitPrice new BigDecimal(2.50); BigDecimal amount owner.getArea().multiply(unitPrice) .setScale(2, RoundingMode.HALF_UP); FeeBill bill new FeeBill(); bill.setOwnerId(owner.getId()); bill.setBillType(1); bill.setAmount(amount); bill.setBillMonth(billMonth); bill.setStatus(0); feeMapper.insert(bill); count; } return count; }这段代码的关键在第二步的幂等检查。物业系统每个月都要生成账单如果管理员手抖点了两次生成按钮没有检查就会产生双倍账单业主看到会直接投诉。selectByOwnerAndMonth查一下该住户该月该类型的账单是否存在存在就跳过。金额计算用BigDecimal并指定RoundingMode.HALF_UP四舍五入到分避免出现0.005这种无法收取的金额。单价从配置读取而不是写死因为不同小区单价不同改配置比改代码安全。3.3 报修工单的状态流转报修是另一个高频业务。工单状态设计成0待处理、1处理中、2已完成、3已取消。状态流转必须由Service层控制不能允许前端随便传状态值public boolean updateRepairStatus(int orderId, int targetStatus, String operator) { RepairOrder order repairMapper.selectById(orderId); if (order null) { return false; } int current order.getStatus(); // 只允许 0-1, 1-2, 0-3 这三种流转 boolean valid (current 0 targetStatus 1) || (current 1 targetStatus 2) || (current 0 targetStatus 3); if (!valid) { throw new IllegalStateException(非法的状态流转: current - targetStatus); } order.setStatus(targetStatus); if (targetStatus 2) { order.setFinishTime(new Date()); } return repairMapper.updateStatus(order) 0; }状态机校验放在Service层前端传什么值都先过这一关。这样即使有人绕过页面直接调接口也改不出已完成直接变待处理这种脏数据。finishTime只在完成时写入方便后续统计维修平均耗时。4. 前端页面与请求链路JSP怎么把数据渲染出来4.1 一个住户列表页的完整链路从浏览器访问/owner/list到页面显示住户表格中间经过Servlet、Service、Mapper、JSP四层。先看ServletWebServlet(/owner/list) public class OwnerListServlet extends HttpServlet { private OwnerService ownerService new OwnerServiceImpl(); Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 接收分页参数给默认值 int page parseInt(req.getParameter(page), 1); int size parseInt(req.getParameter(size), 10); // 2. 查询数据 ListOwner owners ownerService.listByPage(page, size); int total ownerService.countAll(); // 3. 放入请求域转发到JSP req.setAttribute(owners, owners); req.setAttribute(total, total); req.setAttribute(currentPage, page); req.getRequestDispatcher(/WEB-INF/views/owner_list.jsp) .forward(req, resp); } private int parseInt(String s, int def) { try { return Integer.parseInt(s); } catch (Exception e) { return def; } } }parseInt做了容错参数缺失或格式错误时用默认值避免页面直接500。数据放进request域后用forward转发URL不变刷新页面不会重复提交。JSP放在WEB-INF下面浏览器无法直接访问必须经过Servlet这是安全的基本要求。JSP页面用JSTL遍历% page contentTypetext/html;charsetUTF-8 % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % table classtable trth姓名/thth楼栋/thth房号/thth电话/thth操作/th/tr c:forEach items${owners} varo tr td${o.name}/td td${o.buildingNo}/td td${o.roomNo}/td td${o.phone}/td tda hrefowner/edit?id${o.id}编辑/a/td /tr /c:forEach /tablec:forEach是JSTL的核心标签items接收集合var是循环变量。注意EL表达式${o.name}会自动调用getter不需要写getname()。JSTL的jar包要放进WEB-INF/lib否则标签不生效页面会原样输出c:forEach。4.2 表单提交与中文乱码新增住户的表单提交到Servlet中文乱码是必踩的坑。解决方式是在Servlet里第一行设置编码Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); resp.setContentType(text/html;charsetUTF-8); String name req.getParameter(name); // ... 封装成Owner对象调用Service保存 }setCharacterEncoding必须在getParameter之前调用之后调用无效。如果是GET请求传中文Tomcat 8之后的默认URI编码是UTF-8一般没问题但保险起见在server.xml的Connector上加URIEncodingUTF-8。数据库连接URL里的characterEncodingutf8、建库的utf8mb4、JSP的pageEncoding、Servlet的setCharacterEncoding这四处编码要一致缺一处就可能乱码。4.3 分页查询的SQL写法分页用MySQL的LIMITMapper里这样写select idlistByPage resultTypecom.community.entity.Owner SELECT * FROM owner ORDER BY id DESC LIMIT #{offset}, #{size} /selectoffset是偏移量等于(page-1)*size在Service里算好传进来。#{offset}是MyBatis的预编译参数能防止SQL注入。不要用${}拼接那是字符串替换有注入风险。数据量特别大时LIMIT深分页会慢但物业系统住户通常几百到几千完全够用不需要上更复杂的方案。5. 部署与排错IDEA跑JavaWeb项目最容易翻车的五个地方5.1 现象启动Tomcat报ClassNotFoundException: com.mysql.cj.jdbc.Driver原因通常是MySQL驱动jar没有放进WEB-INF/lib或者Maven依赖的scope设成了provided。IDEA里即使pom里有依赖Artifact配置不对也不会打进war包。解决方式是打开Project Structure找到Artifacts确认mysql-connector-java在WEB-INF/lib的列表里。如果用的是Tomcat的lib目录放驱动注意Tomcat 9和MySQL 8的驱动版本要匹配老版本驱动连不上新版本MySQL。5.2 现象页面报404但Servlet类明明写了先检查web.xml的metadata-complete是不是设成了true设成true会忽略WebServlet注解。再检查访问路径有没有带项目上下文比如/property-management/owner/list而不是/owner/list。还有一种情况是IDEA的Artifact没有把webapp目录包含进去部署出来的war包里根本没有JSP文件。在Artifacts配置里确认Output Layout下有WEB-INF/classes和WEB-INF/lib。5.3 现象MySQL连接报Error 2002或时区错误Error 2002通常是MySQL服务没启动或者socket路径不对。Linux下先systemctl status mysql看服务状态Windows下看服务管理器。时区错误是MySQL 8的经典问题报The server time zone value xxx is unrecognized解决就是在JDBC URL里加serverTimezoneAsia/Shanghai。如果加了还报错检查MySQL的my.cnf里default-time-zone配置。5.4 现象JSP页面中文显示成问号按顺序排查四处编码JSP文件头% page pageEncodingUTF-8 %、Servlet的setCharacterEncoding、数据库连接URL的characterEncoding、建库建表时的CHARSETutf8mb4。四处都对了还乱码检查Tomcat的conf/server.xml里Connector有没有URIEncodingUTF-8。另外IDEA的文件编码设置里把Global Encoding和Project Encoding都设成UTF-8避免源文件本身存成了GBK。5.5 现象MyBatis报Invalid bound statement (not found)这个报错的意思是Mapper接口找到了但对应的XML没找到或namespace对不上。检查三点XML文件是否在resources/mapper目录下、mybatis-config.xml里是否注册了该XML、XML的namespace是否等于Mapper接口的全限定名。如果XML放在src/main/java下面Maven默认不会打包需要在pom的build/resources里配置包含**/*.xml。这是新手最容易被卡住的地方报错信息不直观只能靠经验定位。注意每次改完pom或Artifact配置先Build再RedeployIDEA的热部署对JavaWeb支持有限不重新构建经常跑的是旧代码。6. 从能跑到好用账单批量导出与一个我常留的后悔药系统能跑起来只是第一步真正让物业愿意用得解决他们最烦的事。前台每个月最耗时的是把账单导出来发给业主一个个复制粘贴不现实。我的做法是在FeeBillServlet里加一个导出接口用POI生成ExcelWebServlet(/fee/export) public class FeeExportServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { String month req.getParameter(month); ListFeeBill bills feeService.listByMonth(month); resp.setContentType(application/vnd.ms-excel); resp.setHeader(Content-Disposition, attachment;filenamefee_ month .xlsx); Workbook wb new XSSFWorkbook(); Sheet sheet wb.createSheet(账单); Row header sheet.createRow(0); header.createCell(0).setCellValue(房号); header.createCell(1).setCellValue(业主); header.createCell(2).setCellValue(金额); header.createCell(3).setCellValue(状态); int rowIdx 1; for (FeeBill b : bills) { Row row sheet.createRow(rowIdx); row.createCell(0).setCellValue(b.getRoomNo()); row.createCell(1).setCellValue(b.getOwnerName()); row.createCell(2).setCellValue(b.getAmount().doubleValue()); row.createCell(3).setCellValue(b.getStatus() 1 ? 已缴 : 未缴); } wb.write(resp.getOutputStream()); wb.close(); } }Content-Disposition的attachment让浏览器弹出下载框而不是直接打开。POI的XSSFWorkbook处理xlsx格式数据量大时用SXSSFWorkbook流式写入避免内存溢出。导出接口要加权限校验不能让任何登录用户都能导出全小区账单。验证系统是否真的可用我一般做三件事一是造一批测试数据至少50个住户、200条账单跑一遍生成、缴费、导出全流程二是故意传错参数比如page-1、monthabc看系统是报错还是优雅降级三是把数据库连接断开看页面是白屏还是给出友好提示。这三步能暴露大部分低级问题。最后留一个我自己的习惯每次上线前把数据库结构和初始数据导出成init.sql连同war包一起归档。物业系统一旦上线数据就是资产改坏了没有后悔药。有了这个归档哪怕服务器崩了也能在半小时内重建一套环境。这套JavaWeb方案不炫技但胜在每一层都看得见摸得着出了问题能自己修。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

大厂都在用 AI 做什么?我在 2026 D2 AI 大会学到的 Agent 工程精华与 TaoToken 配置实践
大厂都在用 AI 做什么?我在 2026 D2 AI 大会学到的 Agent 工程精华与 TaoToken 配置实践

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

SSM+Vue银行贷款管理系统毕设源码:环境搭建、贷款审批与还款计划全流程
SSM+Vue银行贷款管理系统毕设源码:环境搭建、贷款审批与还款计划全流程

简介:这是一套面向高校计算机相关专业毕业设计的银行贷款管理系统完整项目资料,采用SSM框架搭建后台、Vue构建后台页面、HTML实现前端页面,数据库为MySQL,基于JDK1.8开发,可在Eclipse、MyEclipse、STS或IDEA等工具中运… · 2026/9/26 17:13:45

Java+Springboot+Vue+微信小程序WMS仓库管理系统实战:从Excel到扫码出入库
Java+Springboot+Vue+微信小程序WMS仓库管理系统实战:从Excel到扫码出入库

简介:这是一套基于JavaSpringBootVue并配套微信小程序的WMS仓库管理系统完整源码,面向计算机相关专业学生及企业开发人员,可用于毕业设计、课程设计、大作业或初期项目立项演示,也适合作为前后端分离与小程序开发的实战学习案例。… · 2026/9/26 17:13:45

实战 ToonCrafter:3 步把两张卡通静帧变成 16 帧流畅动画
实战 ToonCrafter:3 步把两张卡通静帧变成 16 帧流畅动画

实战 ToonCrafter:3 步把两张卡通静帧变成 16 帧流畅动画 【免费下载链接】ToonCrafter [SIGGRAPH Asia 2024, Journal Track] ToonCrafter: Generative Cartoon Interpolation 项目地址: https://gitcode.com/GitHub_Trending/to/ToonCrafter ToonCrafter 是… · 2026/9/26 19:37:14

从零手搓生产级Agent:RAG、记忆管理与工具编排实战
从零手搓生产级Agent:RAG、记忆管理与工具编排实战

Agent 这个词在过去一年里被用得太泛了。打开任何一个技术社区,满屏都是"三行代码搭建你的第一个 Agent",但真到了要把一个 Agent 从 demo 推进到能扛住真实流量、能稳定跑在业务链路里的时候,绝大多数人会发现手里那套东西根本不够… · 2026/9/26 19:37:01

Android Studio Windows安装避坑指南:Gradle与SDK配置详解
Android Studio Windows安装避坑指南:Gradle与SDK配置详解

1. 为什么 Android Studio 的安装从来不是"下一步下一步"那么简单如果你在网上搜"Android Studio下载和安装(Windows版)",大概率会看到一堆截图教程,从头到尾就是"点这里、点那里、点Next"。但真正… · 2026/9/26 19:36:55

Cursor系列(1):Cursor安装、虚拟环境与 TaoToken 配置骨架
Cursor系列(1):Cursor安装、虚拟环境与 TaoToken 配置骨架

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

一张丑图胜千言:用Cursor调试DirectX 12着色器时,我重新认识了多模态
一张丑图胜千言:用Cursor调试DirectX 12着色器时,我重新认识了多模态

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

vLLM推理引擎深度解析:从Prefill/Decode原理到生产级部署实战(TaoToken统一API接入篇)
vLLM推理引擎深度解析:从Prefill/Decode原理到生产级部署实战(TaoToken统一API接入篇)

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

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

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

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码