SSM+Vue构建二手母婴交易系统:从需求到部署全攻略

前阵子帮A同学做毕设调研,他拿到的题目编号就是SSM239,要求做一个二手母婴商品交易系统,技术栈限定在SSM和Vue。当时第一反应是“这又是一个典型的课设级全栈项目”,但真正动手梳理业务之后,我发现这个题目其实比想象中要有意思——二手母婴商品交易,它既不是单纯的信息发布平台,又不是纯粹的电商订单系统,它夹杂着信任机制、商品状态管理、图片资源处理、买卖双方沟通等一系列复杂需求。做完之后我把整个项目的拆解思路和一些实现细节沉淀了下来,这篇博文就聊聊从零到上线,一个SSM + Vue的二手母婴交易系统到底怎么做、怎么排坑,以及为什么有些设计我坚决不改。

先给还没接触过这类项目的朋友一个总览:整个系统分成买家端、卖家端和管理员端三个视角,前端用Vue 2 + Element UI搭界面,后端用Spring + SpringMVC + MyBatis处理业务,MySQL存数据。商品从发布、审核、上架、下架到交易完成,中间穿插着收藏、留言咨询、订单状态流转这些功能。下面我会按需求分析、技术选型、数据库设计、核心模块、前后端联调、上线部署这几个层面展开,每一块都给出我当时实际采用的方案和理由。

1. 业务需求拆解:二手母婴交易的特殊性在哪里

1.1 不是普通二手商城,是“高信任交易场景”

很多人拿到这个题目,第一反应是做一套CRUD:商品表、用户表、订单表,页面能登录、能发布、能下单,就完事了。但二手母婴商品和普通二手商品最大的区别在于——买家承担的风险更高。

母婴用品(婴儿床、推车、玩具、衣物)直接关系到婴幼儿安全,买家在交易前会非常在意商品的成色、品牌型号、使用时间、是否有破损、是否清洗消毒过。这种需求直接决定了系统不能只做简单的商品展示,必须给买家提供足够多的判断依据。所以我在需求阶段就确定了几个关键功能点:商品必须支持多图展示(至少5张,涵盖整体、细节、铭牌、瑕疵处)、卖家必须填写成色等级和使用时长、平台必须对商品发布进行人工/半自动审核。

这个洞察是整个项目的第一块基石。后面的表结构、字段设计、页面交互,全部围绕着“降低信任成本”这个核心来展开。

1.2 三个角色和三条业务线

我习惯先把角色和流程画出来再动手写代码,这个项目我梳理出三个主要角色:

  • 买家:浏览商品、按分类/关键字搜索、收藏意向商品、发起留言咨询、下单购买。
  • 卖家:发布商品、管理自己的商品列表(上架/下架/编辑)、查看买家留言、处理订单(确认发货/标记成交)。
  • 管理员:审核新发布的商品、管理用户账号、处理违规商品、查看系统统计数据。

三条业务线的主干流程分别是“发布-审核-上架-下架”、“浏览-咨询-下单-成交-评价”和“审核-管控-统计”。注意订单流程我刻意没有加入支付与物流的深度对接,因为这个项目的定位是校内/区域内的闲置母婴交换平台,线下面交和私下转账是主流,系统主要承担的是信息和撮合职能。这不是偷懒,而是合理裁剪业务边界,否则就得去对接第三方支付和物流接口,项目复杂度会完全失控。

1.3 非功能性需求也要提前想

除了功能,我在立项阶段就和A同学过了一遍非功能需求,这几项直接影响技术选型:

  • 图片资源较多,必须考虑存储路径与访问方式。
  • 商品数据量虽然不大,但搜索和筛选条件多,数据库索引要提前规划。
  • 买家卖家身份要区分,部分操作需要登录拦截。
  • 考虑到课设/毕设演示场景,部署需要简单,最好一台机器能跑全套。

这些约束条件直接决定了后面我为什么选SSM而不是Spring Boot——不是Spring Boot不好,而是在这个规模下SSM的“一切皆配置”反而能让你更清楚每一个请求是怎么被处理的,调试起来也更直观。这个观点对正在做课设或毕业设计的同学尤其有参考价值,后面我会单独讲。

2. 技术选型底层逻辑:SSM + Vue为什么还是不过时

2.1 后端框架:SSM组合的本义

提到SSM,很多同学的第一反应是“旧技术”。但在我接过的十多个类似项目里,学校之所以大量采用SSM作为课设/毕设约束,恰恰是因为它的分层思想足够清晰:Spring管对象和事务、SpringMVC管请求路由、MyBatis管SQL与数据的映射。

实际开发时,我是这样划分职责的:

  • Spring容器管理Service层和DAO层的Bean,事务用注解配置。
  • SpringMVC的Controller负责接收请求、参数校验和视图/JSON返回。
  • MyBatis通过Mapper接口加XML文件实现SQL与业务解耦。

对比Spring Boot的全自动装配,SSM需要你手动配置applicationContext.xml和spring-mvc.xml,这个“麻烦”其实是好事。比如你在配置SqlSessionFactoryBean时,会顺手把mapperLocations指到classpath:mapper/*.xml,你会真正理解数据源、会话工厂、Mapper扫描之间的关系,而不是仅仅依赖一个注解。

我至今都建议初学Java Web的人先拿SSM练一个完整项目再玩Spring Boot,因为后者把太多细节封装掉了,出了问题你连日志都看不懂。这个观点可能有点反主流,但这些年带项目下来,我确信这条路对理解后端体系是更扎实的。

2.2 前端栈:Vue 2 + Element UI的选择逻辑

前端我选了Vue 2搭配Element UI组件库。为什么不用Vue 3?原因很现实:Element UI在Vue 2下生态最稳定,网上的资料最多,遇到问题几乎都能搜到解法,对于项目周期只有一个学期的课设来说,稳定压倒一切。

如果用Vue 3,得配Element Plus,部分组件的API用法与Vue 2版本有差异,光迁移踩坑的时间就够再多写两个模块了。当然,如果你是从头学习新项目,直接上Vue 3也没问题,但如果是SSM这个固定语境,我更推荐成熟的Vue 2 + Element UI组合。

前后端交互我统一用Axios,封装一个简单的request工具类,统一处理baseURL、携带Session凭证、异常提示。整个前端项目没有引入状态管理库Vuex,因为这个项目的数据流足够简单——每个路由页面自己拉接口、自己渲染,没有复杂的多页面共享状态需求。硬塞一个Vuex反而增加了理解负担。

2.3 开发工具与版本搭配

这是我的环境清单,供参考:

  • JDK 1.8
  • Maven 3.6.3,打包用war包部署到Tomcat 8.5
  • MySQL 5.7
  • Spring 5.1.x / SpringMVC 5.1.x / MyBatis 3.4.x
  • Vue CLI 4.x(Vue 2.6)
  • Element UI 2.15.x

为什么依赖版本要列这么细?因为SSM的整合对版本匹配相对敏感,尤其MyBatis与Spring整合包mybatis-spring的版本必须和Spring版本兼容,不然会出现BeanCreationException。我见过太多人一上来就下载最新版,结果一连串的ClassNotFound,最后都不知道怎么死的。锁版本这事,越早做越好。

3. 数据库设计:从商品分类到订单状态,一张表都别乱

3.1 整体数据表结构

这个项目我设计了8张核心表:用户表、商品分类表、商品表、商品图片表、收藏表、留言表、订单表和系统公告表。对比很多课设项目动辄十几张表,我刻意做了精简,但每一张表的字段都经得起推敲。

下面挑几个关键表说一下设计思路。

商品表的核心字段如下(简化版):

字段名类型说明
idint主键
seller_idint卖家ID,关联用户表
category_idint分类ID
titlevarchar(100)商品标题
descriptiontext商品描述
pricedecimal(10,2)售价
original_pricedecimal(10,2)原价,用于展示折扣力度
quality_leveltinyint成色等级:1全新 2九五成 3八成 4七成及以下
usage_durationvarchar(50)使用时长,如“用了1年”
statustinyint商品状态:0待审核 1在售 2下架 3审核拒绝 4已售出
created_timedatetime发布时间

看这个表,有两点部署特别值得注意:一是quality_level成色等级字段,这是母婴二手交易区别于普通二手商品的核心标识,相当于给买家一个Quick的成色刻度尺;二是status字段的取值有5种,覆盖了从发布到售出的完整生命周期,后面做商品列表筛选时,所有条件都围绕这个字段来写SQL。

3.2 分类表:母婴品类怎么划分才合理

分类表看起来简单,但实际设计时我推翻了三版。最初想按“大件/小件”分,后来发现用户习惯是按使用场景找商品,最后定下来的是这样一组一级分类:婴儿车、婴儿床、喂养用品、洗护用品、玩具、童装、孕妈用品、其他。

为什么这么分?因为二手母婴交易的买家大多是前来淘货的宝妈宝爸,他们通常先想“我要买什么场景的东西”,再去看具体品牌。分类表的字段我保留了parent_id用于扩展二级分类,不过在后台商品发布页里,目前只做了一级分类的下拉选择,简单直接。如果你后续想精细化运营,再补二级分类也容易,树状结构随时可以扩展。

3.3 订单状态机:宁可保守,不要乱搞

订单表我单独说一下,这是很多课设同学处理得最毛糙的地方。二手母婴订单的状态我定义为:待付款、已付款、卖家已确认、交易完成、已取消。

五个状态形成了严格的流转路径,每一步都有对应的操作方和触发行为:买家下单后生成“待付款”订单,模拟确认付款后变成“已付款”,卖家在后台确认真实收款后把状态改成“卖家已确认”,买家确认收货后进入“交易完成”,已取消则允许买家和卖家在订单尚未确认前随时发起。

没有做成复杂状态机框架,但状态枚举和状态流转校验是写了的。在Service层更新订单状态时,一定要校验当前状态与目标状态是否构成合法流转,否则返回“非法操作”提示。这个防护在联调阶段救了我很多次,前端如果不小心重复点击“确认按钮”,也能靠后端兜底拦住。

3.4 推荐索引设计

索引这一块,有些同学做完整个项目都不建一个索引,数据量小的时候看着没事,一旦往表里插几百条测试数据,搜索接口立马变慢。

我建的索引集中在:商品表status、商品表category_id、商品表seller_id、订单表buyer_id + status联合索引、留言表product_id。索引不是越多越好,但针对筛选条件建的这几个,刚好覆盖了绝大多数慢查询场景。基于最左前缀原则,联合索引buyer_id + status能同时支撑“买家查询自己全部订单”和“买家查询某状态订单”两类高频查询。

4. 前后端核心功能实现:文件上传、登录校验、搜索分页

4.1 商品图片上传与回显,目录设计是关键

图片上传是这类项目必考的一点,也是最容易踩坑的一点。我采用的方案是后端接收MultipartFile,保存到服务器本地固定目录,然后把访问路径写入图片表。存储路径我建议用绝对路径加时间戳子目录的方式:

String uploadDir = "D:/upload/" + dateStr + "/"; File dir = new File(uploadDir); if (!dir.exists()) { dir.mkdirs(); } String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename(); file.transferTo(new File(uploadDir + fileName));

有一点必须提醒:file.getOriginalFilename()获取到的文件名可能包含客户端路径信息,为了安全和规范,一定要用时间戳或UUID拼一个新的文件名,避免重名覆盖和非法路径风险。

对应的,前端上传组件需要把action指向后端接口,同时带上name参数指定文件字段名。我当时用的Element UI的el-upload组件,大概配置是这样:

<el-upload :action="uploadUrl" :on-success="handleUploadSuccess" :limit="5" multiple> </el-upload>

这个接口的返回格式我硬性规定必须包含图片的访问URL,方便前端把返回值直接拼到图片表字段里。后端对应返回结构统一为{code: 200, msg: "上传成功", data: {url: "/upload/20240912/1234_xxx.jpg"}}。

4.2 多条件搜索:关键词、分类、价格、成色一个都不能少

搜索和筛选是买家端的核心操作。我一开始的接口设计是单独的/product/search,参数有keyword、categoryId、minPrice、maxPrice、qualityLevel、pageNum、pageSize。SQL在MyBatis的XML里动态拼接,核心逻辑如下:

<select id="searchProducts" resultType="com.ssm239.entity.Product"> SELECT * FROM product <where> <if test="keyword != null and keyword != ''"> AND (title LIKE CONCAT('%', #{keyword}, '%') OR description LIKE CONCAT('%', #{keyword}, '%')) </if> <if test="categoryId != null"> AND category_id = #{categoryId} </if> <if test="minPrice != null"> AND price &gt;= #{minPrice} </if> <if test="maxPrice != null"> AND price &lt;= #{maxPrice} </if> <if test="qualityLevel != null"> AND quality_level = #{qualityLevel} </if> AND status = 1 </where> ORDER BY created_time DESC LIMIT #{offset}, #{pageSize} </select>

这里有两个细节,我特别想强调:

第一,keyword使用LIKE '%' #{keyword} '%'的写法,MyBatis会基于#{keyword}做预编译,从源头规避SQL注入,不要拿字符串拼接去构造SQL。

第二,CONCAT('%', #{keyword}, '%')虽然能实现模糊查询,但%keyword%形式会导致索引失效,数据量小无所谓,数据量大的话建议引入全文检索或前缀匹配。这个项目的体量在演示数据下完全够用,所以我没有进一步优化,但如果后续要让系统跑生产,这是第一优先级要改的地方。

4.3 登录校验:拦截器比注解更适合这个项目

用户登录状态的管理,我最终选择了Session方案,原因有两点:系统是单机部署,不需要分布式Session;用户角色简单,不需要引入JWT做跨域无状态认证。

前端在登录成功后,后端把用户对象写入Session。要求登录的接口,我在SpringMVC配置里加了一个拦截器:

public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object user = session.getAttribute("loginUser"); if (user == null) { response.setContentType("application/json;charset=UTF-8"); response.getWriter().write("{\"code\": 401, \"msg\": \"未登录\"}"); return false; } return true; } }

然后在XML配置里为需要登录的路径做拦截:

<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/seller/**"/> <mvc:mapping path="/buyer/**"/> <mvc:exclude-mapping path="/seller/login"/> </mvc:interceptor> </mvc:interceptors>

这个写法比在每个Controller方法里塞一段if(session.getAttribute("loginUser")==null)要干净得多。拦截器是SpringMVC官方提供的横切机制,正好用来做这类通用逻辑。

4.4 统一返回结构和前端Axios封装

前后端联调时,最怕的就是各写各的返回格式。我在项目一开始就定死了后端统一返回JSON结构:

{ "code": 200, "msg": "操作成功", "data": {} }

对应后端写了一个Result类,所有Controller的返回类型都用它包裹。Axios封装里面则统一处理code判断和401跳转:

service.interceptors.response.use( response => { const res = response.data if (res.code !== 200) { if (res.code === 401) { router.push('/login') } Message.error(res.msg || '请求失败') return Promise.reject(new Error(res.msg)) } return res }, error => { Message.error('网络异常') return Promise.reject(error) } )

5. 联调与部署阶段的坑:把SSM + Vue的老毛病一次排干净

5.1 跨域问题:开发环境代理,生产环境同端口

前后端分离开发的时候,Vue跑在8080端口,Tomcat跑在8081端口,直接调用接口肯定会有跨域问题。我在开发环境采用的方案是Vue CLI自带的devServer.proxy:

module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:8081', changeOrigin: true, pathRewrite: { '^/api': '' } } } } }

这么做的好处是前端代码里所有请求路径都以/api开头,开发时由Node代理转发到后端,浏览器没有跨域问题。部署的时候,把前端打包后的dist目录丢进Tomcat的webapps/ROOT,和后端同端口部署,接口路径直接不带/api前缀即可,彻底绕开跨域。

changeOrigin: true这个配置必须打开,否则部分场景下请求头里的Host字段不对,后端某些依赖Host的校验会出问题。这个坑特别隐蔽,我折腾了快半天才定位到。

5.2 日期格式化:JSON序列化把时间变成了时间戳

联调过程中,我发现商品列表里的createdTime返回给前端是一串数字,像1726060800000。这是JavaDate默认序列化成了毫秒时间戳。前端拿这种数据直接展示肯定不行。

解决方式是在Spring配置里自定义ObjectMapper:

<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg value="yyyy-MM-dd HH:mm:ss"/> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>

这里要特别注意:SimpleDateFormat类不是线程安全的,把它作为ObjectMapper的全局dateFormat会不会有问题?实际上Spring的Jackson转换器内部会做同步处理,ObjectMapper本身线程安全,可以放心配置。不过如果你在Service层自己new SimpleDateFormat,那就另说了。

5.3 懒加载N+1查询:商品列表每次都要Extra查询图片

首页商品列表算是高频接口,最开始我的做法是在查出商品列表后,遍历每个商品的id去查它的封面图。这种N+1查询在小数据量时没啥感觉,但一旦列表有20条数据,就会产生1 + 20条SQL,响应时间慢到肉眼可见。

我最后的做法是商品表里冗余一个cover_image字段,存缩略图路径,商品查询时直接取这个字段,主图列表在详情页再通过图片表查。这是一个典型的空间换时间方案,牺牲了一点冗余存储,换来了列表接口的一次查询搞定。

另一个优化点是MyBatis的resultMap里用collection一次性关联查图片列表,但如果关联的是主表所有字段,MySQL还是要跑两次查询(一次主表、一次子表),本质上还是两条SQL。除非用LEFT JOIN+批量主键查询,否则N+1问题很难彻底解决。对课设项目来说,冗余字段方案性价比最高。

5.4 静态资源路径与图片404

图片上传成功后在页面显示404,是另一个高频问题。原因多半是SpringMVC拦截了静态资源请求,导致/upload/**路径没有交给默认Servlet处理。

在spring-mvc.xml里加资源配置是标准做法:

<mvc:resources mapping="/upload/**" location="file:D:/upload/"/>

但还有一个更隐蔽的坑:如果你前端的打包文件部署在Tomcat ROOT目录,而后端访问路径是/upload/xxx.jpg,Tomcat会优先去webapps/ROOT/upload下找文件,根本不会走到映射资源配置。我当时直接把上传目录和ROOT目录做了软链/复制,或者通过Tomcat的<Context>配置外部目录映射来解决。建议在项目文档里明确说明上传目录和部署目录的关系,免得别人接手时一头雾水。

5.5 数据库连接超时与连接池参数

这个坑更隐蔽。数据库默认的wait_timeout是8小时,部署到服务器上之后,如果第二天再打开页面,第一次查询会报“Connection is not available, request timed out”。这是因为连接池里的连接已经超过空闲时间被MySQL服务端关闭了,而连接池没有及时清理。

我在applicationContext.xml的druid数据源配置里加了两项:

# 连接空闲超过60秒就回收 minEvictableIdleTimeMillis=60000 # 检测连接是否可用的SQL validationQuery=SELECT 1

再加上testWhileIdle=true和timeBetweenEvictionRunsMillis=30000,基本可以保证连接池里的连接始终是活着的。这个配置如果你没遇到过,很难往这个方向排查,我在这里记录下来,希望后来者少走两步弯路。

6. 功能跑通之后,这套系统还能往哪里演进

如果一个同学做完上述功能就交付,已经算是一个完整度不错的项目了。但以我过来人的眼光看,这个SSM239项目至少还有三个可以继续深化的方向,每一条都足够再演变成一个进阶课设或者专创项目:

商品检索升级:当前的关键字搜索用的是LIKE模糊匹配,在数据量大时性能瓶颈明显,而且不支持按相关性排序。可以接入开源的全文检索引擎,或者至少在MySQL层面改用ngram全文索引,让搜索体验有质的提升。

订单闭环延伸:前面我刻意裁掉了支付和物流,但如果你想把这个系统做得更“完整”,可以对接沙箱支付环境、模拟快递单号揽收流程,或者加入“信用评价体系”——交易完成后买卖双方互相评价,评价结果沉淀到用户信用分,影响商品排序权重。这个方向特别契合二手母婴交易“高信任”的定位。

数据可视化与管理大屏:管理员端目前只是简单的数据和商品管理,可以基于ECharts做一个统计大屏,展示每天新增商品数、成交量、活跃用户趋势、分类热度排行等指标。这类功能在演示答辩时非常加分,而且实现成本不高,就是从订单表和商品表里做聚合查询再喂给图表组件。

我实际做项目的过程里,最后一条建议经常被同学们忽略:项目做到能跑只是第一步,能讲清楚“为什么这么设计”才是拉开差距的地方。像这篇博文里提到的信任成本、状态机流转、静态资源路径、连接池参数,每一个点在你答辩时都可能成为老师追问的突破口。

关于技术选型再多说一句,SSM这套组合虽然“老”,但老有老的好处——它逼着你去理解配置的每一行,去感受Servlet容器如何托管Servlet、Spring如何接管对象的创建、MyBatis如何把接口和XML绑定在一起。这些东西一旦你想通了,再回头用Spring Boot,会有一种“原来复杂都帮你封装好了”的顿悟感,而不会觉得它是黑盒。

这个项目如果有什么我最后还想提醒的,就是开发顺序:先定数据库表,再写后端接口,最后接前端页面。严格按这个顺序走,返工概率会小很多,不信你试试。

相关新闻

技能地图:从零散技能到可迁移专长的系统学习法

技能地图:从零散技能到可迁移专长的系统学习法

这两年我见过太多人打开收藏夹&#xff0c;里面躺着几十个教程链接、上百个"三天学会XX"的视频&#xff0c;但真正能把一项技能练到能用、能赚钱、能解决问题的&#xff0c;少之又少。问题从来不是不努力&#xff0c;而是大多数人把"技能"当成一个孤立的动…

2026/10/21 5:13:05 阅读更多 →
从机械硬盘到NVMe:驱动器十年演进与技术选型

从机械硬盘到NVMe:驱动器十年演进与技术选型

十年前我帮朋友装机&#xff0c;标配是“一块128G固态装系统&#xff0c;一块1T机械盘存数据”。那时候买个固态盘还要犹豫半天&#xff0c;因为它的价格足够买两块大容量机械盘。十年过去&#xff0c;同样的预算能拿到的驱动器&#xff0c;无论是容量、速度还是形态&#xff0…

2026/10/21 5:13:05 阅读更多 →
Kubernetes核心组件原理与生产级运维指南

Kubernetes核心组件原理与生产级运维指南

1. 这不是教科书&#xff0c;是我在三个生产集群里踩出来的Kubernetes组件地图“Kubernetes 核心组件原理梳理&#xff0c;运维必备~”——看到这个标题&#xff0c;你大概率正被某个Pod卡在Pending状态折磨得睡不着&#xff0c;或者刚被值班电话叫醒&#xff0c;被告知Ingress…

2026/10/21 5:13:05 阅读更多 →

最新新闻

AI信息挖掘实战:从提问到交叉验证,把碎片信息串成认知

AI信息挖掘实战:从提问到交叉验证,把碎片信息串成认知

元旦的钟声刚敲过&#xff0c;我猜不少人正把“新的一年多学点东西、把手头的事做精”写进计划表。这几天我发现一个很有意思的现象&#xff1a;大家不是不想查资料&#xff0c;而是被资料淹没了。打开浏览器想看某个行业的最新动态&#xff0c;结果十条链接里八条是去年的&…

2026/10/21 5:48:18 阅读更多 →
从SLAM到AMCL:自制差速机器人地图导航模块实战解析

从SLAM到AMCL:自制差速机器人地图导航模块实战解析

lingbot-map 这个名字听起来像某个开源仓库的代号&#xff0c;其实是我给自制的差速移动机器人开发的一套完整地图与导航模块。项目核心就一句话&#xff1a;让一台只会上电转圈的底盘&#xff0c;变成能在办公室和家里自主巡航的机器人。它由三个子功能组成——离线建图、在线…

2026/10/21 5:48:18 阅读更多 →
Python语法基础精讲:变量、缩进与运算符优先级实战避坑指南

Python语法基础精讲:变量、缩进与运算符优先级实战避坑指南

简介&#xff1a;这份PPT课件面向Python零基础学习者与编程入门教学场景&#xff0c;系统梳理第2章Python语法基础的核心知识框架。内容围绕变量与数据类型展开&#xff0c;涵盖整型、浮点型、复数、布尔、字符串、列表、元组、字典、集合等类型&#xff0c;并延伸至标识符命名…

2026/10/21 5:48:18 阅读更多 →
互联网医院管理制度文档编写指南:从制度条款到系统代码的落地实践

互联网医院管理制度文档编写指南:从制度条款到系统代码的落地实践

简介&#xff1a;这份文档面向医院管理者、信息科人员及互联网医疗从业者&#xff0c;系统梳理了互联网医院从组织架构到具体业务规范的完整制度框架&#xff0c;可用于制度建设参考、合规自查或岗位培训。压缩包内为1个doc文件&#xff0c;约176KB&#xff0c;内容以制度条文与…

2026/10/21 5:48:18 阅读更多 →
kubeadm 安装 Kubernetes 集群完整指南:初始化、加入节点与排障

kubeadm 安装 Kubernetes 集群完整指南:初始化、加入节点与排障

经常有人问我&#xff1a;“想自己搭一套 Kubernetes 集群&#xff0c;到底从哪下手&#xff1f;”我一般都会回复一句话&#xff1a;先把 kubeadm 用熟&#xff0c;再谈别的。kubeadm 是 Kubernetes 官方维护的集群引导工具&#xff0c;它的目标就是让你别在节点初始化、证书签…

2026/10/21 5:48:18 阅读更多 →
MediaSoup SDP协商详解:ICE、DTLS与RTP参数三层拆解

MediaSoup SDP协商详解:ICE、DTLS与RTP参数三层拆解

做WebRTC服务端的时间长了&#xff0c;你会发现SDP协商是所有“看起来简单、跑起来折磨”的问题里最典型的一个。文本就那么几行&#xff0c;但每一行都对应着一段连接的生命周期。MediaSoup的SDP协商尤其有意思——它并没有像传统服务器那样去解析和重写SDP文本&#xff0c;而…

2026/10/21 5:47:17 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →