SpringBoot+Vue+MySQL旅游管理系统全栈实战与避坑
做Java Web相关的项目这些年我见过的系统类型里“旅游管理系统”绝对算得上常青树。它既不像纯商城项目那么重交易逻辑又不像单纯的CMS那么单薄属于典型的“麻雀虽小五脏俱全”——围绕景点、线路、订单和用户这几条主线把后端接口、数据库建模、前端交互、部署上线整条链路全走一遍。这个项目的技术栈恰好落在SpringBoot Vue MySQL MyBatis这套组合上可以说是Java Web开发里的黄金搭配特别是很多朋友拿来当课程设计、毕业设计或个人练手项目覆盖面非常合适。我一开始接手这个项目时想法比较简单把景点信息、旅游线路、订单一类的功能做出来前后端能通、页面能跑就行。真正做下来才发现这类系统最大的价值不在“能做出来”而在怎么把表结构设计得够用又不冗余、怎么把接口写得规范可扩展、怎么让前端页面和后端数据顺畅协作。这篇文章我想从项目整体拆解、后端实现、前端实现、实操过程与避坑这几块把整个项目的设计思路和实现细节讲明白。1. 项目整体设计与技术选型分析1.1 为什么SpringBoot Vue是这个项目的最优解先说选型逻辑。旅游管理系统本质上是一个典型的CRUD业务系统核心动作是查景点、看线路、下订单、管用户。这类系统的诉求是开发效率高、上手门槛适中、部署简单而不是像电商秒杀那样追求极致的并发性能。SpringBoot的价值在于把Spring生态里那些繁琐的XML配置全部干掉内嵌Tomcat打一个jar包就能跑这对个人项目和中小型管理系统的落地非常友好。Vue这边则是目前前端技术栈里学习曲线最平滑的选择之一。只需要会HTML、CSS、JavaScript基础很快就能上手组件化开发配合组件库可以快速搭建出前后端分离的页面。相比JSP时代那种前后端耦死的方式Vue配合axios走接口交互不仅开发体验更好后期维护也清晰——后端只负责提供JSON数据前端只负责渲染页面。这个项目还引入了MyBatis做数据访问层。为什么要MyBatis而不是Spring Data JPA一个很现实的原因是旅游系统的查询场景很常见多表关联。例如景点列表要展示线路包含关系订单列表要关联用户名和产品名称用MyBatis手写SQL不仅可控性强SQL优化也更直观。很多公司传统项目里依然是MyBatis为主学习这套数据访问方式对找工作和对项目理解的帮助都更大。1.2 系统功能模块划分前台展示与后台管理整个系统按用户角色可以拆成两条线游客/普通用户的浏览购买侧和管理员的维护侧。前台用户端主要包括首页景点展示、景点详情、旅游线路列表、线路详情、在线下单、个人订单管理、登录注册。这其实就是把旅游平台最核心的“浏览—决策—下单—查询”路径走通。这里我想强调一个容易被忽略的点系统不要一上来就堆功能先保证核心路径闭环再去加收藏、评论、评分这些扩展功能。实测下来一个能跑通完整下单流程的旅游系统远比一堆半成品模块更给人信心。管理后台则包含景点管理新增、编辑、上下架、线路管理、订单管理、用户管理。这里的操作模式相对统一基本是“列表 表单 删除/编辑按钮”所以在实现时最适合用组件化的方式去做写完一份列表页模板后面每个模块都能复用。模块划分还有一个隐藏价值它直接决定了数据库表设计和接口粒度。功能定好之后后端控制器、服务层、Mapper层的目录结构基本就跟着定了不会写着写着就跑偏。1.3 数据库表设计六张核心表定全局旅游系统涉及的角色和数据行为不算复杂我设计时采用了六张核心表用户表、景点表、线路表、订单表、评论表、收藏表。用户表主要字段是id、用户名、密码、手机号、邮箱、角色。密码绝不存明文使用BCrypt加密后落库。景点表包含景点名称、所在城市区域、简介、图片地址、开放时间、门票价格、状态。线路表字段相对多线路名称、天数、价格、封面图、行程简介、出发地、状态。订单表是系统里的核心表包含订单号、下单用户ID、产品类型区分景点还是线路、产品ID、金额、状态、创建时间。评论表和收藏表是加分项。评论表关联用户和产品景点或线路包含评分和内容收藏表则记录用户收藏了哪些产品。我的设计原则是“先核心后扩展”。第一版跑通主流程只需要前四张表评论和收藏完全可以等核心功能稳定后再加。很多新手容易犯的毛病是一开始就把表拆得特别细结果业务没想清楚表之间外键关系一团乱麻后面改起来成本极高。表结构就像盖楼的地基宁可在设计阶段多花时间对业务字段进行梳理也不要写到一半再回头加字段。2. 后端服务搭建SpringBoot MyBatis MySQL实战2.1 工程结构与基础配置后端工程我习惯按分包结构来组织单个模块职责清晰扩展时也容易定位com.travel ├── common // 通用返回结果、常量、异常处理 ├── config // 配置类CORS、拦截器注册等 ├── controller // 接口入口层 ├── entity // 数据库实体类 ├── mapper // MyBatis的Mapper接口 ├── service // 业务逻辑层 └── util // 工具类JWT等工程创建完成后最重要的就是配置文件。这里我贴一份实际可用的application.yml关键配置server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/travel_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: 123456 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.travel.entity configuration: map-underscore-to-camel-case: true注意两个细节MySQL 8.x的驱动类名是com.mysql.cj.jdbc.Driver不是老版的com.mysql.jdbc.Driver日期序列化一定要处理好时区否则前端看到的时间和数据库对不上。此外mybatis的map-underscore-to-camel-case开启后数据库下划线字段就能自动映射到实体类驼峰属性省掉一大票手动映射配置。2.2 数据访问层MyBatis映射与SQL优化Mapper层是直接和数据库打交道的部分。我用注解XML混合的方式简单的单表查询直接写在注解里复杂多表查询则放到XML文件中管理这样的好处是后期SQL变动时不必重新编译Java代码。以订单列表查询为例这个接口要展示订单编号、游客用户名、产品名称、金额、状态、下单时间。为了减少接口往返我使用一条JOIN查询把用户信息和产品信息都带出来而不是在业务层多次查表再组装。SQL大致如下select idselectOrderList resultTypemap SELECT o.id, o.order_no, o.product_type, o.amount, o.status, o.create_time, u.username as userName, CASE WHEN o.product_type scenic THEN s.name WHEN o.product_type route THEN r.name END as productName FROM travel_order o LEFT JOIN travel_user u ON o.user_id u.id LEFT JOIN travel_scenic s ON o.product_type scenic AND o.product_id s.id LEFT JOIN travel_route r ON o.product_type route AND o.product_id r.id ORDER BY o.create_time DESC /select这里用了CASE WHEN来区分产品类型避免在Java代码里做二次查询。MyBatis里还有一个高频问题是批量插入和动态SQL。比如景点图片关联表批量插入时用foreach标签一定要确定好collection、item、separator这些属性否则运行起来会报SQL语法错误。分页查询也是旅游系统的刚需。景点列表数据量一旦上来全量查询就非常影响体验。我的做法是使用PageHelper分页插件引入依赖后在查询前调用PageHelper.startPage(pageNum, pageSize)即可源码里的日志会打印出对应的分页SQL方便核对。2.3 业务层与控制器层RESTful接口与JWT认证控制器层我统一遵循RESTful风格。景点相关接口包括GET /api/scenic/list、GET /api/scenic/{id}订单相关的是POST /api/order/create、GET /api/order/myOrders。每次请求返回统一的结果封装避免每个接口各自定义一套返回结构导致前端解析困难。统一返回结果类的核心思路很简单——包含状态码、消息和数据三个字段。登录成功后附带token前端后续请求在请求头里带Authorization字段。JWT生成和校验我放在工具类中拦截器统一处理需要登录的接口。这里贴一个生成token的简化代码public String generateToken(Integer userId, String role) { return Jwts.builder() .setSubject(String.valueOf(userId)) .claim(role, role) .setExpiration(new Date(System.currentTimeMillis() 7 * 24 * 3600 * 1000)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); }拦截器里要排除登录注册这类公开接口否则会有“死循环”问题——用户没登录就永远无法访问登录接口。我一开始做的时候对拦截器路径配置不熟把所有接口都拦截了结果登录都请求不进去调了好一会儿才发现是路径匹配的问题改成“/api/user/login”、“/api/user/register”放行后就好了。2.4 接口联调与自测自己开发和团队协作最大的区别在于没有完整的需求文档和测试人员所有接口都得自己验证。我个人的习惯是用Postman保存一套完整的接口集合按顺序跑通注册、登录、查列表、下订单、查订单。每测完一个接口就把返回结果和参数记录下来下次前端联调时直接照这个作为约定的接口文档。联调过程中发现最典型的问题是日期格式不一致。后端返回了一个数组或长整型时间戳前端显示出来是一串数字。这时候统一在后端把日期格式化为“yyyy-MM-dd HH:mm:ss”字符串前端就不用再做转换。另一个常见返回问题是密码字段被带到了前端虽然前端页面不展示但接口数据里露出来总归不安全。解决办法是在实体类上加JsonIgnore注解或者返回前手动设置空值。3. 前端项目实现Vue从页面到组件3.1 前端工程化准备前端项目我采用Vue CLI创建。工程内的目录结构会直接影响可维护性我的习惯是src ├── api // 接口请求模块 ├── assets // 静态资源 ├── components // 公共组件 ├── router // 路由配置 ├── store // 状态管理Vuex └── views // 页面组件axios拦截器是联调中的核心配置。请求拦截器统一把token加到请求头响应拦截器统一处理错误码。例如后端返回401表示token失效时前端直接跳转登录页。这比在每个页面里重复写错误处理要省太多事。service.interceptors.response.use( response { const res response.data if (res.code ! 200) { Message.error(res.message || 请求失败) return Promise.reject(new Error(res.message)) } return res }, error { Message.error(error.response.data.message || 网络异常) return Promise.reject(error) } )路由配置时需要注意一个点管理后台的页面需要做登录权限校验。我的做法是在路由meta里标记需要admin角色然后利用Vue Router的全局前置守卫判断当前用户角色管理员才能访问后台页面。这样用户直接手动输入后台URL也无法绕过权限。3.2 用户端核心页面实现用户端首页是整个系统的门面布局上通常采用“顶部导航栏 轮播图 热门景点推荐 精品线路推荐”的结构。顶部导航栏放首页、景点、线路、我的订单、登录/注册这些入口通过路由控制页面跳转。景点列表页是浏览体验的核心。我的实现是卡片式布局每张卡片展示景点图片、名称、简介和门票价格。数据由后端分页接口提供前端监听页码变化重新请求数据并渲染。给卡片加一个“查看详情”的按钮跳转到独立详情页详情页展示大图、详细信息、开放时间、票价并把“立即预订”和“收藏”两个按钮放在显眼位置。下单流程是最需要细心的地方。用户点击立即预订后前端要跳转到订单确认页展示产品名称、下单人信息、金额然后用户点击确认支付后调用后端下单接口。支付这里我没有接入真实的支付网关只是模拟支付成功回调把订单状态更新为已支付。这个过程要特别注意按钮的防重复点击否则用户多点几下就会生成多条相同订单。订单列表页放在个人中心里展示当前登录用户的全部订单。每条订单要有订单号、产品名称、金额、状态状态用不同颜色的标签展示用户可以取消未支付的订单。订单状态的变化逻辑是在后端完成的前端只要根据状态字段渲染对应的标签样式即可。3.3 管理后台的表格化页面管理后台我使用Element UI来实现。这个组件库的表格组件el-table配合el-dialog弹窗可以快速构建增删改查页面。景点管理的关键代码可以做成一个通用模板列出所有景点每行提供编辑和删除操作点击新增或编辑时弹出表单对话框提交后调接口并刷新列表。这里有一个实践心得表格页面的搜索条件要独立于表格数据。搜索表单用单独的对象管理点击查询时重新请求第一页数据。删除操作要做二次确认对话框避免误删数据后无法恢复。新增和编辑共用同一个弹窗组件表单字段大多相同只是编辑时通过表单回填数据。管理后台里订单管理的关键操作是查看订单详情、确认订单、取消异常订单。这条逻辑和用户端的下单流程共同组成订单状态机状态字段要前后端统一约定建议使用数字枚举例如0待支付、1已支付、2已取消、3已完成。用数字而不是字符串的好处是数据库存储更简洁前端映射成中文标签也方便。3.4 前后端联调的三个关键点联调是前端项目最容易出问题的地方。第一个关键点是跨域配置。开发环境下前端在8081端口后端在8080端口直接请求后端接口会触发浏览器同源策略。前端可以在vue.config.js里配置devServer的proxy代理把/api请求转发到后端地址这样浏览器看到的请求是同源的避免了跨域问题。第二个关键是BaseURL的配置。很多朋友联调时接口404排查半天发现axios实例里BaseURL写成了线上地址而本地还没部署服务。建议使用环境变量配置来管理不同环境下的接口地址开发环境和生产环境各一套配置换环境时只需要修改环境变量文件不用改代码。第三个关键是空数据与加载状态的体验。页面请求接口时要有loading效果接口失败时要有错误提示或者空状态展示。很多人觉得这是小事但实际使用中“连个加载提示都没有点击按钮没反应”是最拉低体验的致命伤。axios请求过程中配合loading变量控制按钮的禁用态和loading动画页面数据为空时展示“暂无数据”的提示这些细节虽然简单却能极大提升系统的完成度。4. 完整实现过程实录与经验教训4.1 数据库初始化从建库到灌数据正式编码前第一步是把数据库环境准备好。我先在MySQL中创建travel_db库然后执行建表SQL。初始化数据这一步我建议不要手动一条条插入把景点和线路的INSERT语句整理成一个SQL脚本文件一次执行完。数据内容要尽量丰富包括不同价位的产品和不同状态的订单方便后续联调各种页面状态。这个阶段踩过的一个坑是字符集问题。如果建库时没有指定utf8mb4插入中文数据时就会出现乱码或无法插入报“Incorrect string value”错误。解决办法是在建库时明确指定字符集CREATE DATABASE travel_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;utf8mb4比utf8更完整能够兼容生僻字和特殊符号。如果是在旧库里调整可以通过ALTER TABLE语句对所有表做字符集转换但更省事的是从一开始建库就把字符集定对。4.2 核心业务实现下单与支付流程订单流程是系统的核心业务逻辑。我设计的流程是用户从景点详情页发起预订请求后端时携带产品类型和产品ID后端先校验产品是否存在且处于上架状态再检查用户登录状态随后生成订单号并落库。订单号我使用时间戳加随机数实现格式为yyyyMMddHHmmss加6位随机数字。表面看简陋但对个人项目而言足够。支付逻辑这里我做的是模拟支付。用户点击确认支付后后端接口模拟支付平台回调把订单状态改为已支付并返回支付成功信息。实际开发里如果对接真实支付网关还需要处理回调验签、订单幂等等问题复杂度会成倍增加。作为学习和演示项目先把主流程跑通是最重要的。下单接口还实现了一个并发控制点用户重复提交请求时通过订单状态判断是否重复创建。如果用户已经在同一产品的待支付状态中存在订单后端直接返回“已有待支付订单”而不是再次生成新订单。4.3 部署打包从本地跑通到服务器上线项目的部署过程也是整个项目里非常有含金量的一环。后端打包用Maven执行mvn clean package生成SpringBoot的jar文件。前端打包执行npm run build生成dist静态目录。把jar和dist分别部署是典型的前后端分离部署方式。服务器端我使用Nginx作为Web服务入口静态文件指向dist目录接口请求通过反向代理转发到后端的8080端口。关键配置如下server { listen 80; server_name yourdomain.com; root /opt/travel/dist; index index.html; location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { try_files $uri $uri/ /index.html; } }这里有个非常重要的细节Vue Router如果使用history模式刷新非首页路由时会请求一个不存在的路径比如访问/order页面刷新时Nginx会返回404。配置中的try_files $uri $uri/ /index.html就是解决这个问题的把所有未知路径都回退到index.html由前端路由接管页面展示。我当初部署时就是因为漏了这一行刷个页面就404折腾了半个小时才定位到问题。4.4 我在这个项目里踩过的几个典型坑第一个坑是数据库连接失败。现象是项目启动时提示Access denied for user检查后发现是密码不一致。如果是MySQL 8.x还有可能因为密码加密插件问题导致连接失败需要在创建用户时指定mysql_native_password插件。这类问题排查时先看报错信息里的连接URL、用户名和权限再逐步缩小范围。第二个坑是Long型主键传到前端时精度丢失。数据库自增主键是bigint类型Java中对应Long但JavaScript数字类型存在精度限制超过一定位数后后几位会变成0。表现在前端就是“明明数据库里是1234567890123456789页面上显示的却变成了1234567890123456700”。解决办法是给主键字段加上JsonSerialize(using ToStringSerializer.class)注解让Long型转为字符串传输前端就不会丢精度了。这个问题非常隐蔽我一开始完全没意识到是精度问题查了很久才明白。第三个坑是修改了SQL但没重启服务。MyBatis的Mapper XML文件在开发初期是热加载失效状态改完SQL后不能立即生效。很多新手改了SQL后直接刷新页面发现数据没变化就怀疑代码写错了其实是服务没重启。开发时建议把SpringBoot的devtools引入依赖中修改代码和配置后自动重启能省不少调试时间。5. 常见问题排查与避坑速查表5.1 前端白屏怎么办前端白屏在联调阶段出现的概率非常高。通常先按F12打开控制台看报错信息。最常见的两种一是某个组件没有正确引入注册Vue会报unknown custom element错误二是接口请求失败导致页面绑定数据抛异常渲染中断。排查顺序建议是先看控制台有没有红色报错再点击Network标签页看接口请求是否正常返回最后看代码中是否有空指针。例如用户未登录访问订单页面时userInfo可能为null页面直接访问userInfo.orders就会报错。此时要给数据加默认值或做v-if判断。5.2 接口报错怎么定位接口报错时后端控制台的异常堆栈是定位问题的第一现场。Nginx代理环境下接口返回502通常说明后端服务没有启动或端口不对返回504则是后端响应超时。接口404则要看Nginx的location匹配规则和SpringBoot的controller路径是否一致。一个实用习惯是给后端的全局异常处理器加上统一日志输出捕获未知异常并记录到日志。这样即使线上跑了几年出了问题也能通过日志快速定位而不是只能看用户报“页面崩了”却无从下手。5.3 几个实用的排查工具与习惯开发效率有一部分是靠工具撑起来的。后端调试用Postman或Apifox管理接口非常方便它可以把请求历史、环境变量、接口文档一起管理。前端调试依赖浏览器开发者工具Network面板里的请求头、参数、响应一目了然。数据库操作用Navicat或DataGrip直观且支持SQL提示。另外强烈建议养成一个习惯改动代码后先自测关键路径再交付给别人联调。写后端接口时自测一遍最少能发现八成以上的低级错误。项目做完后把启动步骤和注意事项整理成README文档以后换电脑、换环境也都能快速恢复到开发状态。最后分享一点个人体会。做这类全栈项目技术点其实都是常规套路真正拉开差距的是对业务的理解和面对问题时的排查思路。比如订单状态怎么流转、表结构怎么分、异常情况怎么兜底这些事看起来不起眼却决定了系统好不好用、稳不稳定。如果你正准备做一个类似的项目我建议不要急着写代码先花半天时间把表结构和接口清单设计好后面写起来会顺手得多。这个系统的扩展空间也很大——后面可以加景点推荐、行程规划、对接真实支付、接入地图服务每一样都是很好的进阶方向。

相关新闻

mplfinance v0.12.6a3关键参数详解:从默认图到专业级K线图

mplfinance v0.12.6a3关键参数详解:从默认图到专业级K线图

把 mpf.plot(df) 直接跑起来,你得到的大概率是一张“能看但谈不上专业”的图。这个系列前面几篇,我已经把 type 、 style 、 mav 、 volume 这些高频参数翻来覆去讲过,今天这篇继续盯住 v0.12.6a3 里那批容易被忽略的关键字参数。它…

2026/10/15 17:08:13 阅读更多 →
Future.result 超时了,Python 线程却没停:线程池取消任务的三个陷阱

Future.result 超时了,Python 线程却没停:线程池取消任务的三个陷阱

1. 引言在使用 Python 的 concurrent.futures 线程池时,很多开发者会遇到一个令人困惑的现象:调用 Future.result(timeout5) 明明已经超时抛出了 TimeoutError,但后台线程却依然在继续运行,任务并没有真正被取消。本文围绕这一现象…

2026/10/15 17:08:13 阅读更多 →
麦克风阵列信号处理:从波束形成到声源定位的完整落地指南

麦克风阵列信号处理:从波束形成到声源定位的完整落地指南

简介:语音交互在复杂声学环境中常常面临远场衰减、混响和噪声干扰的挑战。麦克风阵列信号处理通过多通道采集与空间滤波,将声源方位信息转化为可计算的相位差,从根本上突破了单麦克风的物理极限。其核心原理包括基于时延补偿的波束形成&#…

2026/10/15 17:08:13 阅读更多 →

最新新闻

基于C++的USB通信上位机开发:从枚举到批量传输的完整实现

基于C++的USB通信上位机开发:从枚举到批量传输的完整实现

简介:这是一份面向C开发者与嵌入式方向学习者的USB通信上位机完整工程源码,聚焦于通过C实现与USB设备的数据交互,涵盖设备枚举、驱动初始化、异步数据传输、错误处理及图形界面等核心模块,适合希望深入理解USB协议与底层硬件操作的…

2026/10/15 17:49:04 阅读更多 →
language-ext Monad Trait 体系深度解析:从 Monad、MonadIO 到 MonadT 的纯函数式组合指南

language-ext Monad Trait 体系深度解析:从 Monad、MonadIO 到 MonadT 的纯函数式组合指南

后端 【免费下载链接】language-ext C# pure functional programming framework - come and get declarative! 项目地址: https://gitcode.com/gh_mirrors/la/language-ext 点击查看 免费下载 导读 language-ext 是一个 C# 纯函数式编程框架,而 Monad&…

2026/10/15 17:49:04 阅读更多 →
Flutter 与 FastAPI 构建多智能体应用:流式输出与状态管理实战

Flutter 与 FastAPI 构建多智能体应用:流式输出与状态管理实战

多智能体系统这两年从论文里走出来,落到实际项目里的速度比很多人预想的要快。但真到动手阶段,一个很现实的问题摆在面前:后端用 Python 写 Agent 编排逻辑,前端用什么?Web 页面在移动端体验拉胯,原生开发又…

2026/10/15 17:49:04 阅读更多 →
Sprite Atlas性能优化:从图集生成到GPU渲染的全链路实践

Sprite Atlas性能优化:从图集生成到GPU渲染的全链路实践

1. 为什么一张图集(Sprite Atlas)能决定UI加载速度的生死线我第一次在某跨平台系统项目里看到“加载卡顿”问题时,团队里有位前端老手直接打开资源面板,指着内存占用曲线说:“不是逻辑卡,是图没加载完。”—…

2026/10/15 17:49:04 阅读更多 →
Android Studio Tab被顶掉与自动关闭?一文教你配置Editor Tabs

Android Studio Tab被顶掉与自动关闭?一文教你配置Editor Tabs

1. 问题现象与影响分析1.1 Android Studio 里 Tab 被顶掉的典型场景很多人在日常开发中都会遇到一个特别恼火的场景:你正在 Android Studio 里同时开着MainActivity.java、build.gradle.kts、AndroidManifest.xml,然后在左侧 Project 面板里随手点开一个…

2026/10/15 17:49:04 阅读更多 →
VLC 3.0.11 定制版支持 AVS+ 与 DRA 软解实战指南

VLC 3.0.11 定制版支持 AVS+ 与 DRA 软解实战指南

简介:本资源为适配Windows 7及以上系统的VLC媒体播放器3.0.11定制增强版,专为需播放国产音视频编码内容的开发者、广电从业人员及高清影音爱好者设计,解决主流播放器对AVS和DRA格式兼容性不足的问题。压缩包为7z格式,大小130.6MB&…

2026/10/15 17:48:03 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →