基于FastAPI+Vue的实验室预约管理系统开发实践
聊一个最近在折腾的开源项目实验室预约管理系统技术栈是 FastAPI Vue。这套系统的名字你可能在一些开源社区见过核心就一件事——把实验室的预约、审批、使用、归还整条链路搬到线上替代以前靠微信群接龙、纸质登记表的方式。我前后跟进了几个版本也踩了不少坑今天把整个项目的设计思路、核心实现和常见问题一次性讲透希望对正在做类似系统或者想拿它练手的同学有帮助。先交代一下背景。我当时接到这个需求是某高校实验室的管理老师提出来的学生要用仪器设备以前要么跑去实验室门口看排班表要么在群里问管理员管理员每天要花大量时间手动协调时间。这套系统要解决的就是三个核心问题——谁能用、什么时候能用、用了之后状态是否可追溯。技术选型上最终定了 FastAPI Vue3 Element Plus主要原因有三点FastAPI 的异步能力和自动文档对这类管理后台开发非常省事Vue3 的组合式 API 写中后台交互清晰前端 UI 组件库现成不用从零造轮子。整个项目完全开源模块拆分、数据模型、接口约定都做了标准化拿来直接部署或者二次开发都行。1. 先聊清楚这套系统到底解决什么问题1.1 实验室预约的真实痛点实验室预约看起来是个简单场景真正落地才会发现里面有很多棘手的细节。首先是设备资源模型不统一有的实验室是按房间预约有的按实验台位有的按高价值仪器比如显微镜、分析仪预约甚至同一台设备在不同时间段有不同的使用权限比如低优先级学生只能约非高峰期。这种情况下单纯做一个“填表 展示”的页面是不够的必须在数据模型层面就支持多种粒度。其次是时间粒度问题。有的实验室按整天约有的按小时约还有的按自定义时段比如 13:30-15:00。系统需要配置不同的时间段模板并且支持节假日、维护时段禁用。最后是审批流程普通学生预约可能要经过导师审批和实验室管理员审批两级而导师或管理员自己预约则直接通过这又涉及角色的权限差异化。这个项目把上述问题抽象成了几个核心领域模型资源Resource、预约单Appointment、时间段TimeSlot、用户与角色User/Role、审批记录ApprovalRecord。后面所有功能都是围绕这几张表展开的。1.2 为什么是 FastAPI Vue而不是别的组合选型这件事我其实纠结过。如果用 Django 模板渲染开发速度也快但前后端耦合太紧后面做小程序端或者移动端要额外适配如果后端用 Spring BootJava 生态确实稳定但当时团队对 Java 栈不熟而且这类系统的并发量根本没到需要 JVM 级优化的程度。FastAPI 的优势在于它是一个 Python 异步框架性能上对这类管理系统绰绰有余自带 OpenAPI 文档前端对接接口的时候可以直接看 Swagger节省很多沟通成本Pydantic 做参数校验很爽前端传错了类型后端立刻返回明确错误省得一堆 if-else。前端用 Vue3是因为项目对交互要求不高但要兼顾桌面端和移动端浏览器Vue 的渐进式特性比较合适。UI 组件库用 Element Plus表格、表单、弹窗、日历都是现成的重点精力可以放在业务逻辑上。1.3 项目整体架构与模块划分整个项目采用前后端分离结构后端目录按领域模块划分auth登录认证、resources资源管理、appointments预约核心、users用户与角色、notifications通知、system系统配置。每个模块内部再按models、schemas、api、service分层避免把路由、业务和数据库操作混在一起。前端按页面组织视图核心页面包括登录页、资源列表页、预约日历页、我的预约页、审批中心、资源管理页、用户管理页。路由层面通过动态路由配合后端返回的权限菜单实现不同角色登录后看到的侧边栏不一样。提示这套分层方式不是拍脑袋订的目的是让新人接手时不至于迷路。哪怕你只是做一个小型版本也建议至少区分 model、schema、service 三层不然所有逻辑都堆在路由函数里改一个字段能牵连一片。2. 后端FastAPI 是怎么把预约这件事做扎实的2.1 项目结构与数据模型设计先看后端目录结构省略了测试和迁移文件基本是这样app/ ├── main.py ├── core/ │ ├── config.py # 全局配置 │ ├── database.py # SQLAlchemy 引擎与会话 │ └── security.py # JWT 与密码哈希 ├── modules/ │ ├── auth/ │ ├── users/ │ ├── resources/ │ ├── appointments/ │ └── notifications/ ├── utils/ │ └── time_utils.py核心的预约单模型我写成了下面这样简化关键字段class Appointment(Base): __tablename__ appointments id Column(Integer, primary_keyTrue, indexTrue) user_id Column(Integer, ForeignKey(users.id), nullableFalse) resource_id Column(Integer, ForeignKey(resources.id), nullableFalse) date Column(Date, nullableFalse, indexTrue) start_time Column(Time, nullableFalse) end_time Column(Time, nullableFalse) status Column(String(20), nullableFalse, defaultpending) # pending/approved/rejected/cancelled/completed purpose Column(String(500), nullableTrue) created_at Column(DateTime, defaultdatetime.utcnow) updated_at Column(DateTime, defaultdatetime.utcnow, onupdatedatetime.utcnow) approver_id Column(Integer, ForeignKey(users.id), nullableTrue) approve_remark Column(String(500), nullableTrue)注意status字段没有用数字枚举而是字符串好处是前端展示和后端判断都直观缺点是数据库空间稍微多一点对这类系统可忽略。date start_time end_time三个字段拆开存而不是合并成一个完整时间是为了后面做冲突检测更灵活。资源模型需要记录资源类型、可预约时间段模板、是否启用审批等class Resource(Base): __tablename__ resources id Column(Integer, primary_keyTrue) name Column(String(100), nullableFalse) resource_type Column(String(20), nullableFalse) # room/seat/device location Column(String(200)) open_time Column(Time, nullableFalse) # 默认开放开始时间 close_time Column(Time, nullableFalse) # 默认开放结束时间 need_approval Column(Boolean, defaultTrue) enabled Column(Boolean, defaultTrue) max_booking_hours Column(Integer, default4) # 单次最大时长 advanced_days Column(Integer, default7) # 最多提前几天预约这些配置项看起来琐碎但直接决定了预约业务能否灵活扩展。比如单次最大时长和提前天数如果写死在代码里后面某个实验室要求不同规则就只能再发一版放数据库配置就方便管理员在后台直接改。2.2 预约状态的流转设计预约不是简单“提交成功”就完事它有一个状态机pending学生提交等待审批approved审批通过预约生效rejected审批拒绝管理员填写原因cancelled主动取消completed使用完成正常结束状态流转的代码集中在 service 层不允许直接改状态字段而是通过方法过渡。比如取消预约时有时间限制如果在预约开始时间前 2 小时内不允许取消防止临时空出时段导致资源分配不稳定。还有一个细节学生提交预约后如果管理员长时间不审批系统会在预约开始前 30 分钟自动过期把 pending 改成 expired。这个定时任务我用的是 APScheduler每 5 分钟扫一次。为什么要做这个因为很多学生提交完就忘了占用资源却不到场导致真正想用的人约不上。2.3 并发冲突处理同一时段多个预约怎么办这是整个系统最容易出 bug 的地方。两个学生同时提交同一个实验室、同一时间段的预约如果处理不好就会双记录都生成后面签到就会打架。最简单粗暴的方案是在代码里先查询再插入conflict db.query(Appointment).filter( Appointment.resource_id resource_id, Appointment.date date, Appointment.start_time end_time, Appointment.end_time start_time, Appointment.status.in_([pending, approved]) ).first() if conflict: raise HTTPException(status_code400, detail该时间段已被占用)但高并发下这段代码并不安全可能出现两个请求都查不到记录同时插入成功。解决方案有两个层面第一在数据库层给resource_id date start_time加唯一约束这样同一资源同一日期同一开始时间只能有一条物理记录还要配合状态过滤实际更复杂第二用 PostgreSQL 的ExclusionConstraint做区间排他这个最严谨但部署成本高。这个项目更务实的处理方式在数据库层加唯一索引 应用层用带锁的事务。例如创建预约的接口先开启事务以资源 ID 为锁维度app.post(/appointments, status_code201) def create_appointment(payload: AppointmentCreate, db: Session Depends(get_db)): resource db.query(Resource).filter(Resource.id payload.resource_id).with_for_update().first() if not resource: raise HTTPException(status_code404, detail资源不存在) # 此时并发请求会排队抢到锁后重新检查冲突 conflict check_conflict(db, payload) if conflict: raise HTTPException(status_code400, detail该时间段已被占用) appointment Appointment(**payload.dict(), user_idget_current_user().id, statuspending) db.add(appointment) db.commit()这里用with_for_update()将资源行锁住后续请求会在数据库层排队等第一个请求 commit 后重新检查就不会出现双记录了。虽然性能有损耗但这类管理系统并发量很低正确性优先。2.4 权限体系学生、老师、管理员的分级权限设计我用了两套配合方案JWT 做登录态RBAC 做接口级权限。用户角色分三种student、teacher、admin。其中teacher比student多一个审批权限admin则拥有全部管理和配置权限。FastAPI 里用依赖注入做权限校验非常舒服def require_roles(*roles: str): def checker(request: Request, db: Session Depends(get_db)): user get_current_user(request, db) if user.role not in roles: raise HTTPException(status_code403, detail没有权限) return user return checker app.post(/appointments/{appointment_id}/approve) def approve_appointment( appointment_id: int, user: User Depends(require_roles(teacher, admin)), db: Session Depends(get_db), ): ...老师可以审批学生预约但普通老师不能修改实验室的开放时间这就要再细分到 admin。这个项目在数据库里还预留了approval_level字段支持未来做多级审批比如导师先审、管理员再审目前生产版本只用了一级但模型支持。3. 前端Vue3 Element Plus 的实现细节3.1 前端工程结构与路由设计前端用的是 Vite 构建工程结构src/ ├── api/ │ ├── auth.ts │ ├── appointment.ts │ ├── resource.ts │ └── user.ts ├── router/ │ └── index.ts ├── stores/ │ └── user.ts ├── layouts/ │ └── DefaultLayout.vue ├── views/ │ ├── Login.vue │ ├── resource/ │ ├── appointment/ │ ├── approve/ │ └── admin/ ├── components/ └── utils/ └── request.ts路由在设计上用了分级路由DefaultLayout包裹所有需要登录的页面。通过 token 获取用户信息后前端再根据角色显示或隐藏菜单。路由守卫的核心代码router.beforeEach(async (to) { const store useUserStore() if (!store.token) { if (to.path ! /login) return /login return true } if (to.path /login) return / if (!store.profile) { await store.fetchProfile() } if (to.meta.roles !to.meta.roles.includes(store.profile.role)) { return /403 } return true })需要注意角色只是控制菜单和页面跳转真正的安全拦截必须以后端接口校验为准前端菜单隐藏只能算“用户体验优化”不能当成安全机制。3.2 日历视图与时段选择组件实现预约页面我建议直接用 Element Plus 的el-calendar做月度总览点击具体日期后下方展示该资源当天的可约时段列表。可约时段的计算逻辑当天日期 资源的open_time / close_time 后端返回的已占用时段——前端把这些数据组合后展示。关键部分是把后端返回的时间段去重。比如有两个已存在的预约占用 09:00-10:00 和 10:00-11:00那么 09:00-11:00 的连续时段就不能约但前端不需要自己算区间合并直接让后端提供一个/resources/{id}/slots?datexxx的接口返回可约片段更省事。这里有个细节跨中午的时段要特殊处理。曾经遇到一个资源open_time是 09:00close_time是 17:00但管理员希望在 12:00-13:00 设为固定维护时段。我是怎么处理的在资源表里加了一个broken_periodsJSON 字段存类似[{start: 12:00, end: 13:00, reason: 维护}]的结构前端展示时段时自动过滤掉这些区间。字段复杂了一点但不用改表结构灵活度也高。3.3 与后端 API 的对接和状态管理状态管理用 Pinia但我没有把太多数据放 store 里只放了用户信息和全局的“资源列表缓存”。预约列表、审批列表这些实时性较强的数据选择在页面组件内部用onMounted请求提交或审批操作成功后重新拉取列表。这样虽然多了一些重复请求但调试方便状态也清晰。请求封装上做了一层 axios 拦截器统一处理 token 注入和 401 跳转service.interceptors.response.use( (response) response.data, (error) { if (error.response?.status 401) { useUserStore().logout() router.push(/login) } ElMessage.error(error.response?.data?.detail || 请求失败) return Promise.reject(error) } )FastAPI 默认错误格式是{detail: xxx}所以这里直接取error.response.data.detail来展示前后端约定统一体验会顺滑很多。3.4 权限控制与页面守卫前端权限控制分两层第一层是路由守卫控制页面访问第二层是按钮级权限。比如学生预约列表上的“取消”按钮在预约开始前 2 小时内要禁用这个状态取决于后端返回的can_cancel字段而不是前端根据时间自己算。为什么因为后端才是时间规则的解释方如果前端本地时间不准确或者被篡改会导致判断错误。类似地“审批”按钮只有角色为teacher/admin才出现这个直接在模板里通过store.profile.role判断即可。4. 核心流程实操从发起预约到完成使用4.1 创建预约的完整请求链路一条预约从创建到状态最终变更完整流程是学生选择资源、日期、时间、填写用途前端提交到POST /appointments后端校验资源是否启用、日期是否在可预约范围内、时长是否超过上限后端做冲突检查通过后写入statuspending如果该资源设置need_approvalfalse则创建后直接置为approved创建成功后向前端返回完整预约对象前端跳转到“我的预约”有一个容易被忽略的点前端提交的时间格式。用户选择日期后再选开始时间、结束时间前端组装成date: 2025-03-20, start_time: 09:00, end_time: 11:00这样传后端用 Pydantic 校验class AppointmentCreate(BaseModel): resource_id: int date: date start_time: time end_time: time purpose: str Field(default, max_length500) model_validator(modeafter) def check_time_range(self): if self.start_time self.end_time: raise ValueError(结束时间必须晚于开始时间) return self校验规则放哪一层我习惯放 schema 层因为这是数据边界能保证任何方式调用API 或测试都会经过验证。4.2 审批环节的实现审批中心的列表页有待办和已办两个 Tab。待办按创建时间升序排列优先展示申请最早的。审批动作也做了一个小设计老师点击“通过”或“拒绝”时可以填写审批备注。拒绝时备注是必填项这样学生能知道被拒绝的原因。后端实现app.post(/appointments/{appointment_id}/approve) def approve( appointment_id: int, body: ApproveRequest, user: User Depends(require_roles(teacher, admin)), db: Session Depends(get_db), ): appt db.get(Appointment, appointment_id) if not appt or appt.status ! pending: raise HTTPException(400, 预约不存在或已处理) appt.status approved appt.approver_id user.id appt.approve_remark body.remark db.commit() send_notification(appt.user_id, 你的预约已通过) return {ok: True}注意一点审批和取消并发时可能出现把已取消的预约改成已通过的情况。所以在审批前再检查一次status ! pending这个判断看起来多余实际能挡住很多边界问题。4.3 签到与结束使用预约通过后学生需要在预约时间段内到达实验室签到。目前的方案有两个管理员在后台手动点击“签到”或者学生通过系统生成的二维码让门禁扫码自动签到。这个是后期迭代的功能初始版本只做了管理员手动确认。签到和结束使用对应两个接口POST /appointments/{id}/checkin和POST /appointments/{id}/checkout。后端会校验当前时间是否在预约时间范围内允许签到提前 15 分钟迟到 30 分钟后自动释放资源。结束使用后学生如果认为设备有异常可以填写使用备注这为后期做设备报修打了一个小基础。4.4 通知与消息推送系统做了一个很轻量的站内通知预约状态变更后推送一条记录到notifications表前端在右上角的小铃铛轮询接口每 30 秒拉一次未读数量。没有引入 WebSocket因为这类场景对实时性要求没那么高轮询足够。但轮询也有讲究不要在路由器切换时会重复注册定时器。我踩过坑组件销毁时没清setInterval结果用户切了几个页面后发出了大量请求。后来统一在onUnmounted里清理并且在请求层加了 AbortController 防重复。扩展方面可以接入企业微信或邮件通知只要把send_notification内部实现替换成对应的发送逻辑即可不影响主流程。5. 常见问题与排查技巧5.1 并发重复预约前面提到用with_for_update()解决了部分问题。排查时有一个技巧在 PostgreSQL 里可以看锁等待或者在应用日志里打印完整的 SQL 和事务持续时间。如果遇到偶发重复先确认是否有不止一个接口能创建预约比如管理员帮学生代预约和学生自己预约走了不同接口但两个接口都没有走同一个加锁逻辑就会出现漏洞。统一改造为同一个 service 层函数并且把事务边界控制在这个函数内部。5.2 时区与预约时间错乱这是一个非常经典的 bug。当时测试环境所有人都在同一时区没发现问题上线后有人用浏览器查看时发现“我约的 9 点显示成了 4 点”。原因就是前后端默认用 UTC 传输时间浏览器显示时又按本地时区转换导致展示错乱。我的解决思路所有时间字段统一按本地时间存储、传输和展示后端存TIME类型不带时区前端传回start_time: 09:00字符串不做new Date(09:00)之类的转换。日期字段用date类型也统一字符串。一句话预约系统这种业务不需要复杂的时区转换只要前后端约定一致全用本地时间字符串就完事。注意如果未来要对接多个校区的设备不同校区在不同时区那就不能这么干了得用带时区的时间戳加 UTC 存储。目前做单校区场景本地时间字符串方案最省心。5.3 前后端联调时的 CORS 和代理问题开发环境前端运行在 5173 端口后端在 8000直接请求必然跨域。我用了两种方式开发环境 Vite 配置 proxy 代理生产环境用 nginx 把/api前缀转发到后端。如果后端也开启了 CORS 中间件需要配置好allow_origins千万别用allow_origins[*]同时又allow_credentialsTrue这是非法组合浏览器会直接报错。app.add_middleware( CORSMiddleware, allow_originsconfig.cors_origins, allow_methods[*], allow_headers[*], )配置cors_origins时建议写成环境变量不要硬编码在代码里。5.4 预约状态不同步的问题曾经出现过一个诡异场景学生取消预约后日历页面仍然显示占用。查了半天发现是前端在取消成功后没有重新拉取时段接口而是本地把已占用的状态直接抹掉了。但后端返回的取消操作实际上如果该预约的类型是“待审批”会直接删掉如果是“已通过”则状态改为cancelled日历接口的数据源是查询这两个状态。各改各的视图就不同步。最后的解决办法所有变更操作成功后统一调用时段查询接口刷新数据源宁可慢一点也不做本地状态猜测。这套系统的数据实时性要求不高永远以服务端为准。6. 部署与二次开发建议6.1 生产部署方案后端我用 Docker uvicorn 多进程拉起前端构建为静态文件后由 nginx 统一服务。数据库用 PostgreSQL比 SQLite 在高并发下更稳定而且支持并发控制特性。唯一要特别注意的地方是uvicorn --workers 4时如果用了内存定时任务每个 worker 都会跑一遍可能重复执行。我把定时任务独立成了单独的进程不混在主 API 进程里。6.2 二次开发从哪里入手如果你是第一次拿到这个开源项目我建议从这几处入手先看appointments模块的 service 层理解状态机逻辑再把资源模型里的配置项在后台试着改一遍感受不同配置对前端展示的影响最后自己写一个统计接口比如“某资源月度使用率”把预约记录按状态、时长、资源分组统计这个练手非常能提升对整体业务的理解。7. 最后的经验心得一路做下来最大的体会是预约系统真正的复杂度不在增删改查而在“状态管理”和“边界条件”。每个用户都对同一份资源有诉求系统必须明确回答谁先用、谁能用、使用记录如何被信任。与其一开始就追求微服务、消息队列这些大而全的架构不如先把这几张表的关系理清楚把状态守恒保证好。最后分享一个小技巧开发阶段在 FastAPI 里把logging配置完整输出 SQL 和执行时间排查问题时效率会高很多。很多预约相关的 bug 都是数据层面引发的能看到完整数据库操作是后续定位问题的前提。这套系统的核心价值在于完整走通了一条可复用的预约业务链路无论你是拿来改造成内部系统还是学习前后端协作都有足够的细节值得参考。

相关新闻

从大纲到定稿:书匠策AI如何把论文写作拆成一条可走通的路

从大纲到定稿:书匠策AI如何把论文写作拆成一条可走通的路

书匠策AI官网www.shujiangce.com,微信公众号搜一搜"书匠策AI" 论文写作这件事,最折磨人的往往不是"写"本身,而是那些散落在各个环节里的"卡壳":开题报告不知道研究问题怎么聚焦,文献…

2026/10/15 17:09:08 阅读更多 →
C#科学型计算器开发:从状态机到表达式解析的完整指南

C#科学型计算器开发:从状态机到表达式解析的完整指南

简介:C#科学型计算器是一款面向C#初学者、计算机专业学生及Windows桌面开发者的完整工程资源,以Visual Studio解决方案形式呈现,包含标准计算、科学计算、平均值计算和关于说明等多个功能窗体,覆盖科学计算器从用户界面布局到核心…

2026/10/15 22:00:43 阅读更多 →
C# WinForm三层架构图书管理系统实战源码解析

C# WinForm三层架构图书管理系统实战源码解析

简介:这是一套基于C# WinForm框架开发的完整图书管理系统源码,面向C#初学者与桌面应用开发入门者,适用于课程设计、毕业设计及小型管理工具实践场景。资源包含可直接运行的WinForm客户端程序、配套SQL Server数据库脚本(.sql文件&…

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

最新新闻

DL/T 698.45协议调试工具:字节级帧解析与主站级故障归因

DL/T 698.45协议调试工具:字节级帧解析与主站级故障归因

简介:这是一款面向电力系统自动化工程师、计量终端开发与调试人员的专业级主站通信调试工具,严格遵循国网DL/T 698.45协议标准,专用于公变集中器、专变采集终端及智能电表的主站侧联调验证。工具支持串口直连、TCP服务器等多种通信方式&#…

2026/10/16 2:42:55 阅读更多 →
IS-IS GR优雅重启原理与配置排障指南

IS-IS GR优雅重启原理与配置排障指南

1. 先搞清楚IS-IS GR到底在解决什么问题1.1 没有GR的时候,路由器重启有多痛工作在骨干网、城域网或者大型数据中心出口的人,对IS-IS应该都不陌生。这个链路状态路由协议依靠Hello报文维护邻居,依靠LSP泛洪让全网LSDB保持一致,最后…

2026/10/16 2:42:55 阅读更多 →
华为设备IS-IS路由控制实战:从L1/L2规划到渗透过滤与选路优化

华为设备IS-IS路由控制实战:从L1/L2规划到渗透过滤与选路优化

1. 为什么现在还要折腾IS-IS路由控制说实话,IS-IS这个协议在很多数通人眼里属于“老古董”了。它比OSPF还早几年定型,平时在企业网里见得少,网上教程也远不如OSPF多。但真到运营商骨干网、大型数据中心内部互联、电力/交通这类专用网络里&…

2026/10/16 2:42:55 阅读更多 →
重学CPU:从流水线、缓存到多核,读懂计算机大脑的工作方式

重学CPU:从流水线、缓存到多核,读懂计算机大脑的工作方式

1. 为什么要“重学”CPU如果你只是用电脑写文档、刷网页、看视频,那CPU对你来说可能只是一个“i5”或“i7”的贴纸。但一旦你想搞明白“为什么我的电脑跑程序卡”“为什么渲染视频时风扇狂转”“为什么现在新CPU的核数越加越多”,你会发现课本里那句“CP…

2026/10/16 2:42:55 阅读更多 →
异地多活架构下数据一致性的核心:消息回放机制解析

异地多活架构下数据一致性的核心:消息回放机制解析

1. 为什么异地多活最难的不是"系统可用",而是"数据一致"我先说一个反直觉的结论:异地多活架构里,流量切换、路由规则、机房探活这些听起来很唬人的东西,其实只占整个改造成本的三成。真正让团队熬夜掉头发的&…

2026/10/16 2:42:55 阅读更多 →
Foundations-of-LLMs PDF 获取指南:《大模型基础》8 份教材文件从单章到全套完整拿全

Foundations-of-LLMs PDF 获取指南:《大模型基础》8 份教材文件从单章到全套完整拿全

Foundations-of-LLMs PDF 获取指南:《大模型基础》8 份教材文件从单章到全套完整拿全 【免费下载链接】Foundations-of-LLMs A book for Learning the Foundations of LLMs 项目地址: https://gitcode.com/GitHub_Trending/fo/Foundations-of-LLMs 《大模型基…

2026/10/16 2:41:55 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/15 19:41:51 阅读更多 →
影刀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 阅读更多 →