news 2026/9/30 7:26:26

校园失物招领小程序开发实战:微信登录、数据库设计与认领状态机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
校园失物招领小程序开发实战:微信登录、数据库设计与认领状态机

简介:基于微信小程序的校园失物招领系统设计与实现资料包,面向计算机相关专业毕业生及小程序开发者,适用于毕业设计、课程设计或项目实训。系统完整实现了失物发布、招领信息展示、论坛交流、公告管理等功能模块,并对系统总体设计、数据库设计及测试方案均有覆盖。压缩包约38.82MB,内含项目源码、说明文档和演示视频,便于对照理解各功能模块的界面实现与前后端交互逻辑。资料文档按系统总体设计、系统实现、系统测试等章节组织,包含设计原则、数据库设计、主界面、失物招领信息界面、论坛模块、公告模块、失物发布模块等具体实现细节。目前已有121人学习,对正在构思相似选题或需要完整参考案例的读者具有实际借鉴意义。

1. 校园失物招领小程序:为什么一套源码能跑通 Demo,却不一定敢上线

大学里每天丢得最多的不是钱包,而是校园卡、耳机、雨伞和水杯。失物招领群里的照片消息,一小时之后就被各种投票、砍价链接刷没,捡到的人找不到失主,丢东西的人刷不到消息。这套“基于微信小程序的校园失物招领系统”要解决的,就是把发布、检索、认领、凭证核验四件事跑成一个闭环,让丢的东西和捡到的东西在小程序里互相找得到。对准备做毕业设计或课程设计的学生来说,这个方向工作量适中、业务逻辑明确、演示效果好;对想练小程序前后端联调的开发者,也是一套完整的真实业务样本。但丑话说在前面:演示视频里丝滑的流程,和真机上能稳定运行的版本,中间隔着一批微信生态特有的坑,随便一个都能让你在答辩现场翻车。

2. 先把架构立住:后端选型、微信登录与请求封装

2.1 为什么主推原生微信小程序 + Spring Boot,而不是 uniapp

微信小程序端的实现,业界最多的是原生和 uniapp 两条路线,外加微信云开发这种“不需要自己管后端”的模式。标题写的是“微信小程序”,我一般会优先推荐原生。原因不是 uniapp 不好,而是它的价值在“一套代码多端复用”:同时要 Android、iOS、鸿蒙和 H5 时划算;如果目标只有微信小程序,uniapp 引入的编译层会让你在排查“为什么这个样式在开发者工具里正常、真机就错位”时多一道黑匣子。答辩现场评审问到底层逻辑时,原生代码也更容易讲清楚。

腾讯云开发模式适合工期紧张、不想碰 Linux 和 MySQL 的场景,但它有两个隐性成本:一是云函数冷启动,演示时突然转圈很尴尬;二是以后想迁移到自建服务器,几乎要重写数据访问层。如果读者有常规 JavaWeb 基础,建议还是 Spring Boot + MySQL,源码、说明文档、演示视频的三角交付也最顺。

方案部署成本答辩友好度数据可控性
原生 + Spring Boot需要一台云主机高,代码可查讲得清高
uniapp + 自建后端多端编译链中,适合多端展示中
微信云开发低,免运维中,云函数逻辑较黑盒低

2.2 wx.login 换 openid 再换 JWT:登录态别在客户端裸传 openid

微信小程序没有传统意义上的“用户名密码”。用户身份来自微信的 openid,获取方式只有一条官方链路:wx.login 拿到临时 code,后端拿 code 去微信接口换 openid。这里第一个容易翻车的地方,是有人图省事在小程序端通过 wx.getUserProfile 拿到昵称头像后,直接把昵称存库当用户 ID,或者把 openid 写在请求参数里传给后端。前者在匿名化趋势下越来越拿不到真实数据,后者等于把用户身份交给了客户端,抓包改一个参数就能冒充别人。

正确做法是在后端维护账号体系。小程序端只负责把 code 交出去:

wx.login({ success: async (res) => { try { const { data } = await request('/auth/login', 'POST', { code: res.code }) wx.setStorageSync('token', data.token) // 这里不要把 openid 写进 storage,后续接口一律不带 openid } catch (e) { wx.showToast({ title: '登录失败', icon: 'none' }) } } })

后端拿到 code 后调用微信 jscode2session 接口,解析出 openid、session_key,然后用 openid 签发 JWT 返回给前端。之后每个业务请求都在 Authorization 头里带 JWT,后端从 token 里解析 openid,而不是从请求体里读。注意 appid 和 secret 只出现在后端配置里,小程序前端代码一旦打包,里面的任何字符串都可以被提取。

// AuthController.java 核心逻辑 public String login(String code) { // GET https://api.weixin.qq.com/sns/jscode2session // 参数:appid、secret、js_code=code、grant_type=authorization_code String openid = wxClient.code2Session(code).getOpenid(); String token = jwtUtil.createToken(openid); // subject 只放 openid return token; }

提示:不要把 appid 和 secret 写在小程序前端代码里,换 openid 的动作必须在后端完成。

登录过期时间我一般设 7 天,微信 session_key 的有效期也是这个量级。过期后 wx.request 返回 401,前端统一跳登录页重新 wx.login,用户无感知再登录。不要每次打开都重新登录,但也不要设 30 天以上,校园场景里丢手机的概率比丢卡高,token 有效期太长等于给别人留后门。

2.3 请求封装与缓存时间:把 wx.request 包成 Promise

小程序侧最值得先写的公共代码就是一个 request 封装。因为后面所有页面都会用到,而且统一处理 token、错误码、超时,能把全项目里重复的 wx.request 回调散落问题一次性解决。我一般会这样做:

// utils/request.js const BASE_URL = 'https://your-domain.com/api' // 上线必须是 HTTPS 并备案 const request = (url, method = 'GET', data = {}) => { const token = wx.getStorageSync('token') return new Promise((resolve, reject) => { wx.request({ url: BASE_URL + url, method, data, header: { 'Content-Type': 'application/json', Authorization: token ? 'Bearer ' + token : '' }, timeout: 8000, // 太久没响应直接失败,避免转圈 success: (res) => { if (res.statusCode === 401) { // token 失效,先清掉,再引导重新登录 wx.removeStorageSync('token') wx.navigateTo({ url: '/pages/login/index' }) reject(res) return } if (res.statusCode >= 200 && res.statusCode < 300) { resolve(res.data) } else { reject(res) } }, fail: reject }) }) }

这段封装的参数值得说明:timeout设 8000 是因为校园网环境下弱网很常见,设太短会误报失败,设太长用户会以为卡死。token 失效走401而不是业务码,是为了让后端拦截器统一返回标准状态码。还有一个细节是 header 里的Authorization用Bearer前缀,这是 JWT 社区的约定,后端解析时按这个前缀切分。

缓存时间与请求封装是配套的。比如首页分类统计、公告这类不频繁变化的数据,一般用 storage 缓存 5 分钟再过期,命中缓存时直接渲染,不命中去请求。这个逻辑可以写进请求层,也可以放在页面层,但要注意:带 token 的接口不能长时间缓存,缓存时间只适用于 GET 的公共数据。

3. 数据库与接口设计:失物表、招领表、认领表怎么建才不会被业务打脸

3.1 拆两张表比用 type 字段一张表更省心

很多半成品为了省事把失物和招领合并成一张 goods 表,加一个 type 字段区分。表面看减少了表数量,实际在写匹配查询时极其别扭:同一天发布的失物和招领要凑成一对,你需要在同一张表里按 type 分别过滤再关联,SQL 里全是 OR 和 CASE WHEN,索引利用率也不高。拆成 lost_item 和 found_item 两张表,逻辑对称,代码里两个 Service 也能共用一套基类。

为什么要拆?因为失物和招领有各自的字段语义:失物表更关注“丢失时间、丢失地点”,招领表更关注“捡到时间、存放地点”。合并后这两组字段有一半是空的,表结构会变得很“稀”。而且认领申请要同时与两张表关联,拆表后申请记录里加一个 item_type 字段就能区分,语义清楚,查询也不容易写错。

3.2 建表 SQL:字段类型、默认值、索引设计

下面是一套可复现的建表脚本,去掉了外键。理由是毕设级项目不需要数据库层约束,service 层校验完全够,且外键在后续做分表、数据迁移时会添乱。字段类型上,时间统一用 DATETIME,不用 TIMESTAMP,可以避免一部分时区转换和 2038 年问题。

CREATE TABLE lost_item ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, openid VARCHAR(64) NOT NULL COMMENT '发布者 openid', title VARCHAR(64) NOT NULL COMMENT '标题,例如:蓝色校园卡', category TINYINT NOT NULL DEFAULT 0 COMMENT '0其他 1书籍 2证件 3电子产品 4衣物 5生活用品', location VARCHAR(128) NOT NULL COMMENT '丢失地点,尽量写具体', detail VARCHAR(500) NOT NULL COMMENT '特征描述,认领时做凭证比对', image_url VARCHAR(255) NOT NULL DEFAULT '' COMMENT '图片 fileID 或转存后的 URL', status TINYINT NOT NULL DEFAULT 0 COMMENT '0待匹配 1认领中 2已取回 3已关闭', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx_status_time (status, create_time), KEY idx_category_time (category, create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='失物表'; CREATE TABLE found_item ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, openid VARCHAR(64) NOT NULL COMMENT '捡到者 openid', title VARCHAR(64) NOT NULL COMMENT '标题,例如:北门捡到一串钥匙', category TINYINT NOT NULL DEFAULT 0, location VARCHAR(128) NOT NULL COMMENT '捡到地点或暂存地点', detail VARCHAR(500) NOT NULL COMMENT '外表特征,便于失主核验', image_url VARCHAR(255) NOT NULL DEFAULT '', status TINYINT NOT NULL DEFAULT 0, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx_status_time (status, create_time), KEY idx_category_time (category, create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='招领表'; CREATE TABLE claim_record ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, item_id BIGINT UNSIGNED NOT NULL COMMENT '物品 ID', item_type TINYINT NOT NULL COMMENT '1失物 2招领', claimer_openid VARCHAR(64) NOT NULL COMMENT '认领人 openid', proof_text VARCHAR(300) NOT NULL COMMENT '认领人提供的凭证描述', status TINYINT NOT NULL DEFAULT 0 COMMENT '0待审核 1通过 2驳回', create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_item (item_id, item_type), KEY idx_claimer (claimer_openid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='认领申请表';

参数说明:openid用 VARCHAR(64),微信返回的 openid 最长不到 40 字符,留余量。detail给到 500 是因为要承担凭证比对功能,写长了也不影响查询,真正查匹配时走 title 和分类。status 用 TINYINT 而不是枚举字符串,是为了 Java 后端映射简单、数据库排序也快,但代码里一定要写常量类,不然三个月后自己都看不懂 2 代表什么。索引只加了两个组合索引,一个服务首页列表,一个服务分类筛选,像title这种字段不加索引,因为模糊查询%关键词%根本走不了索引,加了也是白加,这一点很多人会误踩。

3.3 发布页面:单选框、图片上传与幂等提交

发布失物是整个系统的第一个核心动作。页面里的分类建议直接用radio-group渲染,比 picker 少一次点击,在“丢东西着急”的场景里体验更好。单选框的 name 就是后端 category 数字,微信小程序的 value 和 label 要通过数据映射维护,不要写死在 wxml。

图片上传的流程是:用户选择图片后先调wx.compressImage把宽边压到 800px,质量为 60 到 80,再上传到后端或云存储。这里有一个很多源码里会偷懒的点:直接拿wx.chooseMedia返回的临时路径去展示,真正保存时才发现临时路径在页面退出后就失效了。正确的做法是拿到临时路径后立刻压缩、立刻上传,把返回的 fileID 或 URL 保存到数据库。

后端创建接口的幂等处理也值得写。用户网络差、手抖双击提交按钮,会产生两条一模一样的失物记录。前端可以加一个提交中的锁,但这不够,后端必须有能力识别重复。最常见做法是前端生成一个requestId(UUID),后端拿到后先去idempotent_record表里查,存在就直接返回第一次的结果,不存在才插入业务数据并同时写入幂等记录。这个机制不复杂,但对演示环节特别重要——答辩时真机网络一抖,列表里冒出两条相同的失物信息,那种场面比任何提问都尴尬。

接口返回的最终结构我习惯统一为{ code: 0, message: "ok", data: {} },code为 0 表示成功,非 0 表示业务错误。这样请求封装里处理逻辑可以非常简单:看到 code 非 0 就 toast,不区分 HTTP Status 和业务错误,排错时也只需要盯后端的 controller 日志。

4. 匹配与认领:把状态机、凭证核验和分页做成闭环

4.1 关键词匹配:分类 + 模糊查询 + 时间窗,为什么不用 Elasticsearch

失物招领系统的“智能匹配”其实是伪需求。真实场景是用户自己刷列表,系统能做的只有两件事:按分类筛选,按关键词兜底搜索。很多人一看“匹配”就想到 Elasticsearch,实际在一个校园场景里,一天发布的失物和招领可能就几十条,MySQL 单表全表扫都绰绰有余,引入 ES 只是给自己增加运维负担。我一般在 service 层写一个组合查询,逻辑是“同分类 + 标题或详情包含关键词 + 最近 14 天 + 状态为待匹配”:

// FoundItemService.java 关键查询 public List<FoundItem> matchLostItem(LostItem lost) { // 与失物同分类的招领,最近 14 天登记的 String keyword = extractKeyword(lost.getTitle()); // 简单分词:去掉地点词、类别词 String sql = "SELECT * FROM found_item WHERE status = 0" + " AND category = ?" + " AND (title LIKE ? OR detail LIKE ?)" + " AND create_time >= NOW() - INTERVAL 14 DAY" + " ORDER BY create_time DESC LIMIT 20"; // LIKE 参数为 "%" + keyword + "%" }

这里的核心参数有两个。时间窗设 14 天是经过考虑的:校园卡这类物品超过两周还没被认领,基本已经进了回收站,时间窗太长会让列表里堆满过期信息。关键词匹配用双 LIKE,是标准的兜底做法,命中率取决于 title 写得规不规范。我在“发布引导”里会强制用户把标题写成“物品名 + 特征色”,比如“蓝色校园卡”,而不是“寻物启事”,这样匹配效果会好很多,这也属于用业务规则反向约束数据质量。

4.2 认领流程:状态机、凭证核验与实际掌控权

认领是整个系统最容易被做成“形同虚设”的部分。很多毕设里,失主点击“我要认领”,这条记录就变成已认领——完全没考虑捡到的人怎么确认这个人就是失主。正确的流程应该是一个双向确认:失主对招领记录发起认领申请,提交一段凭证描述;拾主看到申请后,凭自己的物品特征与凭证描述比对,选择通过或驳回。

我在发布和申请时各留一个字段来支撑核验逻辑:发布者填写 detail 时要写“别人不知道的特征”,比如“背面贴了绿色贴纸,学号后四位 1234”;认领人在 proof_text 里填写外表描述。拾主觉得对得上就通过,对不上就驳回。这正是设计模式里状态机模式的轻量落地:把状态转移汇聚到 Service 方法里,不要散落在 Controller 各接口中。状态流转用一张表就能说清楚:

当前状态可执行动作下一状态触发条件
待匹配 0失主发起认领申请认领中 1记录状态为 0,申请写入 claim_record
认领中 1拾主审核通过已取回 2claim_record.status 置 1,确认取回
认领中 1拾主审核驳回待匹配 0claim_record.status 置 2,释放申请
任意状态发布者关闭已关闭 3超过 30 天未处理,定时任务或手动关闭

状态机的实现要点是:所有状态变化都通过 Service 层方法,不要在 controller 里直接 setStatus。并且更新状态时一定要带原状态作为 WHERE 条件,例如UPDATE item SET status = 1 WHERE id = ? AND status = 0,防止并发下两个用户同时认领同一条。返回影响行数为 0 时说明状态已经被别人改过,前端提示“手慢了,这条已经被认领了”。

4.3 列表页分页与图片压缩:性能细节决定演示效果

失物招领系统的列表页是最高频页面。如果一次性把几百条记录塞进 setData,最低配 Android 上滑动会很“肉”,而且微信开发者工具里看不出来,真机一跑就露馅。我一般固定pageSize=10,上拉触底加载下一页,hasMore由后端根据“总数是否大于已返回数”来返回。

// pages/found/index.js 核心分页逻辑 data: { list: [], page: 1, pageSize: 10, hasMore: true, loading: false }, async loadList(reset = false) { if (this.data.loading) return // 防止重复触发 if (!reset && !this.data.hasMore) return // 没有更多直接返回 this.setData({ loading: true }) const page = reset ? 1 : this.data.page const res = await request(`/items/found?page=${page}&pageSize=${this.data.pageSize}`) this.setData({ list: reset ? res.data.list : this.data.list.concat(res.data.list), page: page + 1, hasMore: res.data.hasMore, loading: false }) }

分页接口后端要记得在查询末尾加LIMIT ? OFFSET ?,并返回 hasMore 布尔值。前端concat而不是push的原因:setData 在更新数组时会做 diff,如果你想替换整个列表,引用变化要明确,concat生成新数组再 setData,比逐个 push 再 setData 更稳定。同时wx:for的wx:key一定用item.id,不要用 index,否则删除或状态变更时视图渲染会出现错位。

图片压缩参数也要提一下。用户在手机相册里选的照片往往是 4000px 宽、5MB 大小,直接上传会让服务器带宽吃紧,列表页加载也会变慢。发布时用wx.compressImage做一次压缩,宽度 800px、质量 80,在这个尺寸下校园卡上的文字依然清晰可辨,加载速度却能快一个数量级。

5. 排查与避坑:真机部署后最容易翻车的五个位置

5.1 图片存的是临时链接,第二天全部失效

现象:演示视频里图片正常,第二天打开小程序,列表里的图裂了一片。

原因:微信云存储或getTempFileURL返回的临时链接有效期一般只有 2 小时,如果发布时直接把临时链接存进了 MySQL,读取时当然会过期。而很多模板项目为了省事,恰恰是这么干的。

解决:图片上传后保存 fileID 或后端转存后的 CDN 地址,不要在数据库里落临时 URL。用云存储的话,展示时通过 fileID 动态换取临时链接,并且要做好缓存。如果后端是自建服务器,上传接口把图片存到本地目录或对象存储,数据库只存最终可访问的 URL。

5.2 token 过期后接口全部 401,页面白屏

现象:用户早上打开小程序还能刷列表,下午再进来,所有请求都报 401,页面停在那里转圈。

原因:登录态过期后没有统一处理,页面各自请求各自失败,没有一个入口触发重新登录。

解决:在统一请求封装里拦截 401。收到 401 后清掉本地 token,跳转到登录页重新走 wx.login。这里注意不要在每个页面各自wx.showToast,否则用户会看到一串错误弹窗。重新登录成功后最好能回到原来的页面,所以登录页跳转前把当前页面路径先存到 storage,登录完成后再wx.redirectTo回来。

5.3 自定义顶部导航栏在不同机型上偏移

现象:iPhone 上按钮位置正常,Android 真机上标题顶到状态栏,按钮和胶囊重叠。

原因:微信小程序的顶部导航栏高度不是固定值。状态栏高度因机型而异,胶囊按钮的位置也不同,自定义导航栏时若直接写了固定 padding,必然在部分机型上错位。

解决:用wx.getWindowInfo()获取statusBarHeight和胶囊按钮的top,动态计算导航栏高度:

const windowInfo = wx.getWindowInfo() const statusBarHeight = windowInfo.statusBarHeight const capsule = wx.getMenuButtonBoundingClientRect() const navHeight = (capsule.top - statusBarHeight) * 2 + capsule.height

这段代码在 app.js 或导航栏组件里执行一次,结果存到全局。之后所有页面的自定义导航栏都用这个高度。这属于小程序特有适配问题,换其他跨平台框架也会遇到,但原生代码排查起来路径最短。

5.4 开发者工具能跑,真机一直 request 失败

现象:模拟器里一切正常,真机预览时接口全部 timeout。

原因:小程序真机环境要求所有 request 域名必须配置到小程序后台的“request 合法域名”里,并且必须 HTTPS 且域名已备案。开发者在工具里勾选“不校验合法域名”可以绕过,但这个选项只对开发者工具生效。答辩现场换了电脑新装项目,忘了重新勾选这个选项,就会看到白屏。

解决:把后端接口域名绑定到已备案的 HTTPS 域名,在小程序管理后台的“开发管理 -> 服务器域名”里添加 request 合法域名。本地联调时用开发者工具的不校验选项,上线前一定要检查后台配置。另外,配置域名时不能带路径,只能写到二级域名根,例如https://api.example.com。

5.5 时间显示差了 8 小时

现象:发布一条信息,列表里显示“8 小时前”,而实际刚发布一分钟。

原因:服务器系统时区是 UTC,MySQL 连接串没有指定serverTimezone,导致NOW()的时间和北京时间差 8 小时。这是 Linux 服务器默认配置和国内业务时区不一致的经典坑。

解决:在 JDBC 连接串里显式加上serverTimezone=Asia/Shanghai,同时确保容器或系统时区也设置为Asia/Shanghai。如果仍然不一致,可以在数据库里执行SELECT NOW()看当前时间,对比系统date命令的输出,定位是 MySQL 层还是应用层的问题。逐层排查,比在代码里硬加 8 小时更靠谱。

6. 从能跑到能上线:验证方法与一个值得投入的进阶

这套源码包拿到手,先别急着跑 demo。把说明文档里的表结构章节翻出来,确认三张表和接口清单对得上,再启动后端。然后把自己当成真正的失主,走一遍“丢卡 -> 发布 -> 捡到人登记 -> 认领 -> 凭证核验 -> 取回”全链路,每一步都看数据表和网络请求是否符合预期。很多翻车现场其实都是这么试出来的。

更近一步,可以用简单的脚本模拟高并发提交。不要上 JMeter 那套重型工具,直接用 Node 脚本并发打 20 个创建订单接口,观察三个指标:有没有重复数据、响应耗时是否稳定、数据库是否死锁。这一步能验证幂等逻辑和状态机的并发正确性,比任何演示都更有说服力。验证清单可以浓缩成下表:

验证项预期结果失败时的排查位置
重复提交同一 requestId 只产生一条记录idempotent_record 表
并发认领只有一人成功改状态SQL 里 WHERE status = 0
401 重登无感知恢复请求封装的 401 分支
图片过期24h 后仍能访问存的是 fileID 或 CDN URL
缓存 5 分钟首页秒开但不过期storage 的时间戳比较

进阶方向上,最值得做的一个增强是把“匹配”做成“通知”。现在系统是用户主动刷列表,但真正丢东西的人不会一天刷十次。可以在后端加一个定时任务,每隔 5 分钟扫描新登记的招领信息,与未完成的失物记录做匹配,命中后通过微信订阅消息推送提醒。这个改动业务价值高、代码量可控,答辩时也是一个很不错的“创新点”。订阅消息需要用户在小程序里主动订阅一次,推送逻辑本身并不复杂。缓存时间这时候也有讲究:消息推送前要检查对应失物记录是否仍在“待匹配”状态,避免给已经取回的用户推无用信息。

我做这个题目时栽得最深的坑是低估了凭证核验的细节——一开始只用标题匹配,结果一个“校园卡”能匹配出 200 条,演示效果很差。后来改成分类加特征描述加凭证比对后,整个流程才真正闭环。希望这篇笔记能帮你把这一套流程走通,少踩几个我当年踩过的坑。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 7:26:18

能减少损耗的柴火鸡培训有哪些,众鸡厂柴火鸡跑山鸡现杀技术教学

盘龙区众鸡厂餐厅店&#xff0c;是昆明本土深耕柴火鸡赛道多年的个体工商户&#xff0c;坐落于昆明871文化创意园内&#xff0c;1300㎡的综合实体门店同时经营柴火鸡堂食接待与柴火鸡技术教学培训&#xff0c;是兼顾云南本土烟火风味守护与餐饮创业实干赋能的本地特色餐饮品牌。…

作者头像 李华
网站建设 2026/9/30 7:25:53

12 个真正好用的提示词:把要求写成验收标准

12 个真正好用的提示词&#xff1a;把要求写成验收标准 先说清楚&#xff1a;为什么复制过来的提示词经常不好用 提示词这个品类有个很别扭的地方&#xff1a;它在别人手里好用&#xff0c;粘到你这边就变成一串客气的废话。原因通常不在模型&#xff0c;而在那段话本身——它…

作者头像 李华
网站建设 2026/9/30 7:24:08

C++ vs Python实测:100倍速度差!普通人该选哪个?

百万播放实测&#xff0c;两种热门语言差距竟如此离谱2026年3月13日, 有一条技术类的短视频, 这条视频意外地变得特别火, 它只用了很短的时间, 就拿到了超过一百万的播放量, 这一举动直接让大众的关于技术的讨论变得更加热烈了起来。视频里面的博主并没有去堆积那些复杂的专业术…

作者头像 李华
网站建设 2026/9/30 7:23:56

AI测试走向生产级:如何跨越从概念试点到规模化落地的鸿沟

近期&#xff0c;QECon全球软件质量效能大会围绕“驾驭AI&#xff0c;提质增效”展开多场专题研讨&#xff0c;大模型与Agent如何重塑软件测试工程体系成为全场核心热议议题。伴随Agent智能体技术从概念原型加速向生产级工程落地演进&#xff0c;软件迭代节奏持续提速&#xff…

作者头像 李华
网站建设 2026/9/30 7:23:51

K8s集群Calico网络安全深度加固实操

K8s集群Calico网络安全深度加固实操技术栈&#xff1a;Kubernetes v1.32.13 Rocky Linux 8.6 Calico网络组件 Containerd 1.7.x操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案K8s集群Calico网络安全深度加固实操操作环境K8s 集群 3 节点&…

作者头像 李华
网站建设 2026/9/30 7:22:30

【通信原理面试笔记 03】信道:分类、多径传播与衰落机制

第 3 章讲的是怎么用随机过程描述信号&#xff0c;第 4 章换了一个提问角度&#xff1a;信号从发送端走到接收端&#xff0c;中间那条路究竟对它做了什么&#xff1f; 把整章读下来&#xff0c;它的逻辑其实只有三环——先给信道分类&#xff08;谁在传、传得稳不稳&#xff09…

作者头像 李华