尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
EBS Form触发器开发指南:分类、层级、调试与避坑
做EBS开发这些年几乎每个客户早晚都会问到一个问题Form里的触发器到底怎么用、怎么排查。尤其是刚接触Oracle EBS二次开发的新手一打开Forms Builder的Trigger列表面对两百多个触发器选项人直接懵了——不知道该往哪个触发器里写字不知道触发顺序谁先谁后更不知道同一个字段上为什么WHERE-VALIDATE-ITEM不生效。这篇文章就是围绕EBS系统FORM开发里的触发器展开的。我会从最基础的触发机制讲起把内置触发器、命名触发器、KEY触发器的分工和实际写法全拆开配合真实表单场景给出一套可以直接上手的开发套路。适合正在做EBS客制化开发、维护客户化Form、或者准备从Oracle Forms转型EBS开发的读者。看完你至少能回答三个问题这个逻辑该放哪个触发器它什么时候会被触发触发不了怎么查1. EBS FORM触发器是什么和数据库触发器有什么不一样1.1 一句话先建立整体认知EBS的界面层是Oracle Forms跑起来的所谓FORM开发很大一部分工作量就是在Forms Builder里拖画布、放数据块、设置属性然后往各类触发器里写PL/SQL代码控制界面行为和数据流转。这里的触发器本质上是表单运行时的事件处理器。用户点了按钮、打开了表单、切换了焦点、提交了数据Forms框架就会抛出对应事件如果你在某个触发器里写了代码这段代码就在事件发生的瞬间被执行。没写代码事件就静默过去什么都不发生。数据库里的触发器是挂在表上的比如BEFORE INSERT、AFTER UPDATE靠DML语句来激发FORM触发器是挂在表单对象上的FORM级、BLOCK级、ITEM级靠用户操作和表单内部状态变化来激发。二者虽然都叫触发器但触发的源头完全不同。你在数据库里建了UPDATE触发器用户在FORM界面改数据提交后确实会触发数据库触发器但你在FORM里写WHEN-VALIDATE-ITEM数据库根本感知不到——一个是数据库对象一个是界面运行对象。1.2 两层架构理解FORM触发器执行位置的第一个关键EBS的整体结构界面层是Forms Runtime数据层是Oracle数据库。FORM触发器里的PL/SQL代码大部分在客户端/中间层的Forms运行时进程里执行不是直接丢给数据库执行。这也是很多人调试时的一个误区觉得在触发器里写的SQL出了问题去数据库里查V$SESSION看不到会话查不到正在跑的SQL。不过代码里如果写了INSERT、UPDATE、SELECT这些SQL最终还是会通过网络发到数据库去执行。所以你经常看到的一条开发经验是触发器里少写复杂的集合操作多利用Forms自带的内置函数和包因为Forms运行时和数据库之间的往返是有性能开销的。这个点我在后面“性能优化”里还会展开。1.3 顺带澄清硬件D触发器、边沿触发器与EBS无关写这篇文章前我特意看了一眼相关的网络热词发现很多人在搜“D触发器”“边沿触发器”“CMOS双稳态触发器”。这些都是数字电路里的概念说的是用晶体管搭出来的状态存储单元跟EBS开发完全不是一回事。可能只是因为都带“触发器”三个字搜索引擎把两类内容搅在了一起。假如你不是做硬件设计、而是做EBS开发的搜到那些内容说明方向带偏了。EBS FORM里用的触发器触发时机不是“上升沿”“下降沿”而是“事件”。比如进入一个表单、离开一个字段、按下某个键这些都叫事件。你把这两类概念分开后面的学习才不会混乱。2. FORM触发器的分类体系与触发层次2.1 内置触发器按功能划成四大族Forms Builder左侧的对象导航器里每个数据块、每个画布项下面都有一个Triggers节点右键可以新建触发器。弹出的列表里能看到所有内置触发器按命名规律大概能分成几类我平时开发就按这个维度记忆比死记两百个名字高效得多触发族命名规律典型代表什么时候触发导航触发族WHEN-NEW-*WHEN-NEW-FORM-INSTANCE、WHEN-NEW-BLOCK-INSTANCE、WHEN-NEW-RECORD-INSTANCE、WHEN-NEW-ITEM-INSTANCE焦点从一个对象切换到另一个对象时校验触发族WHEN-VALIDATE-*WHEN-VALIDATE-ITEM、WHEN-VALIDATE-RECORD字段、记录值被校验时查询触发族PRE-QUERY、POST-QUERY、WHEN-QUERY-EXECUTE查询执行前、查出结果后、执行查询键时数据检索生命周期事务触发族PRE-INSERT、ON-INSERT、POST-INSERT、PRE-UPDATE、ON-UPDATE、POST-UPDATE、PRE-DELETE、ON-DELETE、POST-DELETE、WHEN-COMMIT插入、更新、删除提交前后写库操作前后KEY触发族KEY-*KEY-EXIT、KEY-COMMIT、KEY-QUERY、KEY-DUPREC等按下对应键盘功能键时实际开发中WHEN-NEW系列和WHEN-VALIDATE系列用的最多KEY系列在客制化按钮里也经常碰到。2.2 定义层次FORM级、BLOCK级、ITEM级以及覆盖规则同一名字的触发器可以建在FORM对象上也可以建在BLOCK上还可以建在某个具体ITEM上。它们的作用范围逐级收窄触发顺序遵循一个基本规则先内层后外层。举个例子WHEN-NEW-ITEM-INSTANCE这个触发器用户从物料编码字段切到数量字段系统先触发数量字段ITEM级自己的WHEN-NEW-ITEM-INSTANCE若这个字段没建就往上一层找数据块BLOCK级是否建了同名触发器数据块也没有再找FORM级有没有FORMAT也没有就什么都不执行。如果你在同一字段上同时建了ITEM级和BLOCK级同名触发器系统只执行ITEM级的不会两个都执行。这个“就近覆盖”规则很多人第一次踩坑在FORM级写了一个通用的WHEN-NEW-ITEM-INSTANCE结果某个块上又建了块级的同名触发器发现通用逻辑没跑——不是被覆盖成失效而是被块级版本“屏蔽”了。这个设计其实是有讲究的。它让公共逻辑可以放在FORM级特殊逻辑在各块各字段上单独覆盖不用在公共逻辑里写一堆IF判断当前块是哪个。我自己的习惯是只在FORM级放真正全局通用的逻辑业务差异尽量下沉到对应层级避免层级一多脑子里逻辑打架。2.3 命名触发器把公共代码封装成可复用过程除了系统内置触发器Forms还允许建命名触发器常见的是Procedure和Function两种。它们不会被系统自动触发要手动调用本质上是存放在FMB文件里的可复用子程序。命名触发器的典型用途有三个多个触发器共用一段逻辑。比如两个字段的WHEN-VALIDATE-ITEM都要做同一套金额校验把校验逻辑写在命名触发器里两个地方各调一句MyValidateAmount;。封装复杂查询或数据操作。比如从子库存表取可用量SQL比较长写成命名触发器GetAvailableQty传参返回触发器里调用。作为菜单按钮和自定义按钮的调用入口。EBS客制化表单经常在标准界面上加按钮按钮的WHEN-BUTTON-PRESSED里调用命名触发器代码更干净。命名触发器还有助于解决Forms 11g一个不太好受的限制触发器里的代码块如果太长编译报错时定位麻烦。拆成多个命名触发器后每个都短小清晰定位问题快很多。3. 常用触发器的实际应用场景与PL/SQL写法3.1 初始化场景WHEN-NEW-FORM-INSTANCE到WHEN-NEW-ITEM-INSTANCE的执行链FORM打开时焦点按固定顺序走一遍FORM - 第一个BLOCK - 第一个RECORD - 第一个ITEM。这一路上会依次触发WHEN-NEW-FORM-INSTANCE、WHEN-NEW-BLOCK-INSTANCE、WHEN-NEW-RECORD-INSTANCE、WHEN-NEW-ITEM-INSTANCE。这串顺序是死的初始化和默认值逻辑放哪一层取决于你要控制的范围。我举一个真实需求打开采购订单录入界面时希望把订单头块的“订单类型”默认设为“标准采购”同时把“日期”默认设为当前日期。字段默认值其实可以直接在属性面板设置但有些默认值依赖登录人、责任、配置文件属性面板写不了就得在触发器里控制。如果只针对订单头块那放在WHEN-NEW-BLOCK-INSTANCE里定位订单头块后赋值最合适如果整个FORM所有数据块的日期字段都要默认今天的日期就放FORM级的WHEN-NEW-FORM-INSTANCE里遍历或逐个块设置。-- WHEN-NEW-BLOCK-INSTANCE 示例定位到订单头块时初始化 IF :SYSTEM.CURRENT_BLOCK ORDER_HEADER THEN :ORDER_HEADER.ORDER_TYPE : STANDARD; :ORDER_HEADER.ORDER_DATE : SYSDATE; END IF;这里有一个很多人忽略的点WHEN-NEW-FORM-INSTANCE执行时第一个块虽然在界面上但焦点还没正式进去此时给字段赋值是安全的但如果你想在此时调用GO_BLOCK去切块就要小心递归触发。我后面在“踩坑”里会专门说这个。3.2 校验场景WHEN-VALIDATE-ITEM和WHEN-VALIDATE-RECORD的分工WHEN-VALIDATE-ITEM在光标离开某个可输入项、且该项值发生变化时触发是字段级校验的主力。需要改界面上的数据时可以直接在块里给其他字段赋值但要注意不要在WHEN-VALIDATE-ITEM里去修改当前正在校验的字段本身这样会再次触发校验形成递归。WHEN-VALIDATE-RECORD则是在记录级触发时机比字段级晚一档。当光标从当前记录离开、或执行了某些触发提交动作时先校验完所有字段的WHEN-VALIDATE-ITEM再执行WHEN-VALIDATE-RECORD。做个对比一个订单行块数量、单价、金额三个字段。数量变化时校验数量不能为0这个逻辑放数量字段的WHEN-VALIDATE-ITEM里但如果要联动计算金额需要把单价也带进来——此时单价可能还没校验、甚至还没录入在数量字段的WHEN-VALIDATE-ITEM里读单价会有空值风险。稳妥做法是放到WHEN-VALIDATE-RECORD里所有字段的第一次校验都跑完了再算金额-- WHEN-VALIDATE-RECORD 示例订单行块计算行金额 IF :LINE.QUANTITY IS NOT NULL AND :LINE.UNIT_PRICE IS NOT NULL THEN :LINE.AMOUNT : :LINE.QUANTITY * :LINE.UNIT_PRICE; END IF;字段校验和记录校验的分工就这么简单一条记录里多个字段互相依赖时往记录级放只依赖当前字段本身的往字段级放。3.3 查询场景PRE-QUERY、POST-QUERY的配合EBS的查询有两种输入查询条件后执行查询以及直接执行查询把所有记录拉出来。PRE-QUERY在查询执行前触发适合给查询条件填充默认值或者在查询前锁定一些上下文变量。POST-QUERY在每条记录被查出、但还没显示在界面上时触发是给查询结果字段做补充赋值的高频位置。举一个经典需求订单行查询出来之后要显示物料描述但物料描述没有存在订单行表里需要通过物料ID去物料表取。-- POST-QUERY 示例根据物料ID回填描述 SELECT DESCRIPTION INTO :LINE.ITEM_DESCRIPTION FROM MTL_SYSTEM_ITEMS_B WHERE INVENTORY_ITEM_ID :LINE.INVENTORY_ITEM_ID AND ORGANIZATION_ID :LINE.ORGANIZATION_ID;这里有个性能细节POST-QUERY对每一条查出的记录都会执行一次。如果一次查询查出200条这段SQL就跑200次。即使有索引200次往返也不便宜。优化方向有两个一是能通过视图或LOV直接带出描述就不在这里再查一次二是一次取数后放到内存变量类似“先查一次放RecordGroup再逐条匹配”的方式。具体取舍跟数据量有关但至少你要知道POST-QUERY里每写一条SQL查询性能就掉一截。3.4 KEY触发器与客制化按钮的定制逻辑KEY系列触发器比较特殊它映射的是Forms运行时里的功能键——F5查询、F6保存、CtrlS、F4删除记录、CtrlQ退出、CtrlE输入查询等。标准EBS界面顶层菜单已经接管了这些功能键客制化开发中一般不直接在KEY触发器里写业务逻辑因为会和EBS的标准事件处理冲突。但有一个场景绕不开你在界面上放了一个“保存”按钮希望点击按钮后执行标准保存流程再附加自己的逻辑。这时按钮属性上有个Trigger Event, 你通常会在WHEN-BUTTON-PRESSED里调用DO_KEY(COMMIT)或COMMIT_FORM来模拟用户按下保存键-- WHEN-BUTTON-PRESSED 示例自定义保存按钮 BEGIN -- 保存前补充逻辑比如记录最后更新时间 :HEADER.LAST_UPDATE_DATE : SYSDATE; -- 执行标准提交 DO_KEY(COMMIT_FORM); -- 保存成功后的反馈 FND_MESSAGE.SET_NAME(YOUR_APP, SAVE_SUCCESS); FND_MESSAGE.SHOW; EXCEPTION WHEN OTHERS THEN FND_MESSAGE.SET_TOKEN(ERROR, SQLERRM); FND_MESSAGE.SHOW; END;注意DO_KEY执行的行为跟用户在键盘上按功能键一致会触发对应的KEY触发器也可能触发提交前的一系列校验。如果你直接写COMMIT_FORM;跳过KEY层的事件分发部分标准校验逻辑可能不会执行。所以模拟标准操作优先用DO_KEY不要直接调用底层内置过程这是EBS开发的一个隐性铁律。4. 触发器开发要点系统变量、代码模板与调试方法4.1 常用系统变量不写死当前对象名的关键Forms内置了一批系统变量以:SYSTEM.开头最常用的是这几个系统变量含义典型使用场景:SYSTEM.CURRENT_FORM当前运行的FORM名通用触发器里做分支判断:SYSTEM.CURRENT_BLOCK当前光标所在BLOCK名WHEN-NEW-BLOCK-INSTANCE里判断进入哪个块:SYSTEM.CURRENT_ITEM当前光标所在ITEM名通用ITEM校验里知道用户在哪:SYSTEM.TRIGGER_ITEM触发当前触发器时的数据项WHEN-VALIDATE-ITEM里动态取值:SYSTEM.RECORD_STATUS当前记录状态NEW/CHANGED/QUERY判断记录是新录还是修改有一个非常实用的组合在一个块级WHEN-VALIDATE-ITEM里想对多个需要非空校验的字段统一处理不用给每个字段各建一个触发器可以直接判断:SYSTEM.TRIGGER_ITEM是哪个然后按字段分别处理-- 块级 WHEN-VALIDATE-ITEM 示例 CASE :SYSTEM.TRIGGER_ITEM WHEN QUANTITY THEN IF :LINE.QUANTITY IS NULL THEN FND_MESSAGE.SET_NAME(YOUR_APP, QTY_REQUIRED); FND_MESSAGE.SHOW; RAISE FORM_TRIGGER_FAILURE; END IF; WHEN UNIT_PRICE THEN IF :LINE.UNIT_PRICE 0 THEN FND_MESSAGE.SET_NAME(YOUR_APP, PRICE_INVALID); FND_MESSAGE.SHOW; RAISE FORM_TRIGGER_FAILURE; END IF; END CASE;RAISE FORM_TRIGGER_FAILURE是Forms触发器的保留异常抛出后当前触发器的操作会被判定为失败。在WHEN-VALIDATE系列里抛出它校验不通过焦点不会继续往下走。这个异常你在普通PL/SQL存储过程里见不到是Forms环境的专属写FOFM开发必须熟练用。4.2 标准调用模板FND_MESSAGE、APP_STANDARD、FND_STANDARDEBS的触发器里不能像裸Oracle Forms那样随便写MESSAGE(xxx);。EBS有自己的消息框架主要有两个包FND_MESSAGE管理用户消息和错误提示。FND_STANDARD提供SET_INFO、SET_WHO等标准调用比如记录创建人、创建时间。-- WHEN-CREATE-RECORD 示例给新建记录设置创建人和时间 :HEADER.CREATED_BY : FND_GLOBAL.USER_ID; :HEADER.CREATION_DATE : SYSDATE;在EBS标准表单里创建人这些WHO字段通常由FND_STANDARD.SET_INFO统一维护。客制化表单也可以在PRE-INSERT或WHEN-CREATE-RECORD里调FND_STANDARD.SET_INFO它会根据当前登录用户把CREATED_BY、LAST_UPDATED_BY等字段自动填上省去一个个赋值。APP_STANDARD是EBS在Forms里封装的另一个包主要用于事件分发。比如你想在客制化代码里模拟点击标准工具栏的“保存”优先用APP_STANDARD.EVENT(COMMIT)它比直接DO_KEY更贴合EBS封装。很多从裸Forms转过来的开发不知道这个方法代码里写DO_KEY也能跑但和EBS的顶层菜单事件处理可能打架。4.3 调试触发器Forms运行时该怎么查问题Forms的触发器调试是很多新人的噩梦因为报错信息不太直观。这里我按自己的习惯列几个排错手段打开 Forms Runtime 的调试菜单在运行Form的窗口上用CtrlShiftJ调出调试控制台能看到当前触发器是否触发、系统变量当前值、SQL执行情况。这是最直接的手段。利用WHEN-WINDOW-OPENED或日志表在触发器里写一段INSERT到自定义日志表记录触发时间、当前块、当前项、传入参数再执行操作后查日志表。这个办法土但非常有效尤其适合客户现场排查。用FND_LOG写日志EBS提供了FND_LOG.STRING过程可以按级别写日志到日志表比建临时日志表更正规FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE, YOUR_APP.PROCESS, Trigger fired on block: || :SYSTEM.CURRENT_BLOCK);检查编译错误触发器里PL/SQL写错时Forms Builder在保存时会报编译错误。但有些运行时错误要到触发时才暴露比如字段名拼写错、先引用未赋值的变量。所以触发器代码要养成先编译、再运行、再测边界条件的习惯。5. 常见问题与避坑指南5.1 触发器写了但不执行根源排查思路这是社区里提问率最高的一类问题。触发器不执行第一反应不是怀疑逻辑而是按照下面顺序查第一步看触发器建在哪个层级上。前面说过就近覆盖规则如果FORM级和BLOCK级都建了同一个WHEN-NEW-ITEM-INSTANCE永远先执行BLOCK级。可能你的代码写在FORM级被块级覆盖掉了。第二步看触发时机对不对。比如字段校验逻辑写在了WHEN-VALIDATE-RECORD但用户只是修改了这个字段后马上点了另一个块里的按钮可能记录校验在此时不会触发——因为焦点离开当前记录前校验触发条件不满足。要把逻辑放到真正匹配用户操作的触发器上。第三步看是不是导航被锁住了。有些触发器在执行时报错Forms会阻止导航继续你在用户操作上看不到报错弹窗但后续事件都不跑了。这时打开调试菜单看是否有异常被吞掉。第四步检查功能键是否被EBS标准事件拦截。KEY系列不起作用多半是EBS顶层菜单接管了按键事件。这类情况建议改用WHEN-BUTTON-PRESSED配合自定义按钮实现。5.2 触发器里的SQL和Forms环境变量上下文切换的正确姿势在触发器里直接引用界面字段语法是:BLOCK.ITEM这没问题。但如果你在SQL语句里混用Forms变量就要小心绑定和时间点的问题。举个例子POST-QUERY里写SELECT DESCRIPTION INTO :LINE.ITEM_DESCRIPTION FROM MTL_SYSTEM_ITEMS_B WHERE INVENTORY_ITEM_ID :LINE.INVENTORY_ITEM_ID这段SQL在Forms运行时发到数据库:LINE.INVENTORY_ITEM_ID会被Forms翻译成绑定变量传入。数据库执行计划会以绑定变量来解析复用性好。如果你图省事把:LINE.INVENTORY_ITEM_ID替换成:SYSTEM.CURRENT_BLOCK这种系统变量很多系统变量数据库端拿不到值SQL里引用会报ORA错误所以要牢牢记住SQL里面只能放数据块字段系统变量要先用PL/SQL变量接住。5.3 递归触发最隐蔽的坑WHEN-VALIDATE-ITEM里改了自己校验的字段、WHEN-NEW-ITEM-INSTANCE里调用GO_ITEM切换焦点、WHEN-NEW-BLOCK-INSTANCE里GOS_BLOCK跳到同块……这些都是递归触发的高发写法。先说简单的解决方案在触发器开头放一个包级别变量做“重入保护”。-- 包变量示例在PACKAGE BODY里定义 if g_in_trigger then return; end if; g_in_trigger : true; -- 业务逻辑... -- 结束前复位 g_in_trigger : false;再说一个我踩过的具体坑在WHEN-NEW-FORM-INSTANCE里用GO_BLOCK跳到另一个块会重新触发被跳块的WHEN-NEW-BLOCK-INSTANCE如果那个块里又写了GO_BLOCK跳回第一个块两个触发器互相跳界面就卡死了。解决思路是设置一个Form级的标志位判断是否执行过一次跳转第二次进入时跳过跳转逻辑。这种递归问题调试起来很难看最好写代码时就把触发链画一遍——心里有谱再动手。5.4 性能问题触发器里循环和SQL的取舍客制化FORM跑得慢一半以上的锅在触发器里的SQL上。常见的性能隐患有POST-QUERY里逐条查数据库这是最典型的。一次查询100条记录触发器里的SELECT会执行100次哪怕单次只要0.01秒累加起来也是1秒延迟。WHEN-VALIDATE-RECORD里做跨表多表关联查询每次保存一行都跑复杂查询数据量大时保存过程卡几秒。在LOOP循环里一条条执行UPDATE不如改成一次FORALL或者临时表批量处理。优化不是让你什么都别在触发器里查而是要有意识地减少“逐条往返”。像取值这类操作能用LOV的属性带出来就不要在POST-QUERY里再查一次必须查的尽量加WHERE条件过滤掉不必要的数据。Forms的底层数据访问有块查询、Record Group、临时表等多种手段选对了性能差别是数量级的。6. 一个小技巧最后分享一个我这些年养成的习惯不要在一个触发器里憋一大段逻辑而是把所有可复用逻辑都拆到命名触发器里。比如金额计算写一个命名触发器CALC_AMOUNT行状态刷新写一个REFRESH_LINE_STATUS两个业务按钮、三个校验触发器都去调用它。这样改业务规则时只需要改命名触发器里的代码不用到处找同一段逻辑藏在哪个触发器里。Forms的项目维护起来本来就比Java、Vue这类前后端分离的工程繁琐代码组织得越模块化后面改需求、查Bug、同事接手时越省心。官方文档和技术论坛里能查到的知识点很多但真正把一套触发器体系用得顺手靠的还是大量实操踩坑换来的经验。希望这篇文章能帮你少趟几个我趟过的浑水。
RELATED

相关推荐

Python构建农产品价格数据分析与可视化系统全流程实战

Python构建农产品价格数据分析与可视化系统全流程实战

先说一个直觉:你在菜市场看到的那块价格牌,本身就是一组很典型的时间序列数据。每个批发市场、每个品种、每个交易日的价格,背后都能挖出波动规律、价差关系和季节趋势。我花了两周半的时间,用 Python 做了一套农产品价格数据分析…

📅 2026/9/28 12:52:21
在线五子棋实时对战:WebSocket通信与状态同步实践

在线五子棋实时对战:WebSocket通信与状态同步实践

在线五子棋对战做到第三篇,棋盘基础交互早就通了,落子也能走,服务端接口也能通。但真正要喊朋友来下一盘,发现还差得远——一落子就卡顿、两边棋盘对不上、刷新一下就全没了,这些才是“在线对战”真正要命的细节。这一…

📅 2026/9/28 12:47:21
网络层核心知识详解:IP地址、路由转发与排障实战

网络层核心知识详解:IP地址、路由转发与排障实战

做了十来年网络运维,如果有人问我OSI参考模型里哪一层最“承上启下”,我的答案永远是网络层。这层没有传输层的“端到端”那么容易理解,也没有应用层的功能那么耀眼,但恰恰是它,把无数异构网络串联成了今天这个互联网。…

📅 2026/9/28 12:47:21
MORE NEWS

更多资讯

📰

用Dify把零散记录变成可检索的复盘系统,避免重复踩坑

谁没有过这种时候:一个线上事故折腾了两三天才定位,回看聊天记录才发现同事上周就提过类似风险;一个需求上线后数据没涨,翻需求评审文档才发现当时大家纠结过同一个假设。事情做完了,回头看全都明明白白,可…

📰

JWT安全实践指南:从结构原理到漏洞攻防与加固落地

1. 为什么JWT安全值得单独写一篇文章1.1 先看两个真实事故我先把话说在前头:JWT(JSON Web Token)这几年几乎成了后端鉴权的默认答案,Spring Security整合JWT、SPA项目里用token做登录态、网关层统一校验身份,到处都是它…

📰

SSM二手车网站毕设实战:从零搭建可控Java Web项目

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

📰

Type-C与锂电池双供电切换:PMOS+肖特基混合方案实战

1. 双供电切换的工程痛点与方案选型做过便携设备硬件的人大概都有过这种经历:板子上同时挂了Type-C接口和锂电池,插上Type-C的时候想让Type-C供电,拔掉的时候自动切到电池,听起来逻辑简单得不行,但实际调起来电压跌落、…

📰

深度学习驱动的智慧家庭聊天机器人:意图识别与工程落地实践

简介:这是一份面向计算机专业毕业设计的完整项目资料,聚焦智慧家庭场景下的智能聊天机器人,采用深度学习模型实现自然语言理解、对话生成与家居控制等能力,适合正在完成毕业设计的学生或希望上手智能语音助手的开发者。压缩包共二…

📰

Model-Optimizer:模型交付前的硬件兼容性与可部署性校验体系

1. 这不是“一键压缩”工具,而是模型交付链路上的隐形守门人“Model-Optimizer”这个名称在当前技术社区里正以一种微妙的方式被使用——它既不是某个广为人知的开源项目代号,也不是某家大厂官方发布的SDK产品名,而更像是一类工程实践的统称&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬