最新要闻
- 世界看热讯:在史上“最热闹”的上海车展 特斯拉竟然缺席了 维权有阴影?
- 漫威面临征服者康难题
- 世界微头条丨爆款狂促!玫瑰精油洗发水47.8元买1000ml:解决软塌油头
- 焦点观察:王一博主演!《长空之王》领跑五一档预售票房榜
- 72岁王石出手创立私募基金:曾表态市场一定会惩罚暴利
- 方萍萍:2023年04月18日原油交易策略
- 秦昊结了几次婚?秦昊的老婆叫什么名字?
- 罗云熙真实身高体重是多少?罗云熙为什么那么瘦?
- 粉红法拉利是谁唱的?粉红法拉利完整版歌词
- 化骨绵掌是什么意思?化骨绵掌是谁的绝招?
- 车俊焕多大了?车俊焕个人资料介绍
- 关注:大连积极扩大有效投资加速迈向“万亿GDP城市”
- 每日热议!生产力起飞!金山官宣WPS AI:聊天帮忙做好Word文档
- 环球今日报丨发布三个月跳水超1000!苹果M2版Mac mini降到3478元了
- 全球快资讯:上海一物流网点起火:快递员怀疑液体可燃 用打火机尝试发现真的可燃
- 今晚发布!小米13 Ultra配置带你提前看 就差价格了
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【天天时快讯】springboot统一响应实体封装+统一异常类管理
前言:
在日常前后端分离的接口开发过程中,需要我们按相应的格式给前端返回响应的数据,常见的方式就是我们后端自己封装一个包装类,每次返回给前端数据的时候都需要我们自己手动构建一。
(相关资料图)
短时间内来看或许并没有什么,但是一旦接口量变大,我们每个接口都去构建返回值的话,那样就会浪费我们很多的开发时间,所以我们就可以对响应的内容进行统一的处理,在写Controller中的方法时我们也可以不用统一返回类型了。例如:
@ApiOperation(value = "分页查询告警信息") @PostMapping("findAlarmByPage") public PageInfoselectAll(@RequestBody AlarmReqVo alarmReqVo) { return towerAlarmInfoService.findByPage(alarmReqVo); }
这样可以让我们减少很多的工作量。 可能有的朋友就会问:那我们的非空验证可一些异常的处理怎么办呢? 下面介绍的就是统一的异常类型管理。把我们后端所有能发生的异常进行统一的封装(可以自定义一个异常类型),封装之后再返回给前端相应的提示,那么前端就会清晰的知道后端发生了什么错误,是不是前端的锅哈哈哈哈。
响应实体的封装:
首先肯定我们还是需要建一个统一返回的类:
1 package com.dlxx.tower.app.util; 2 3 import com.fasterxml.jackson.annotation.JsonInclude; 4 import lombok.AllArgsConstructor; 5 import lombok.Data; 6 import lombok.NoArgsConstructor; 7 8 @Data 9 @AllArgsConstructor 10 @NoArgsConstructor 11 //这个注解表示变量为空的时候构造json就不带上这个变量 12 @JsonInclude(JsonInclude.Include.NON_NULL) 13 public class FrontResult { 14 /** 15 * 结果状态码 16 */ 17 private Integer code; 18 /** 19 * 响应结果描述 20 */ 21 private String message; 22 /** 23 * 返回数据 24 */ 25 private Object data; 26 27 public FrontResult(Object data) { 28 this.data = data; 29 this.code = ResultEnum.SUCCESS.getCode(); 30 this.message = "操作成功"; 31 } 32 33 /** 34 * 静态方法,返回前端实体结果 35 * 36 * @param code 状态码 37 * @param message 消息 38 * @param data 数据 39 * @return 前端实体结果 40 */ 41 public static FrontResult build(Integer code, String message, Object data) { 42 return new FrontResult(code, message, data); 43 } 44 45 /** 46 * 返回成功的结果实体 47 * 48 * @param message 消息 49 * @param data 数据 50 * @return 实体 51 */ 52 public static FrontResult getSuccessResult(String message, Object data) { 53 FrontResult result = new FrontResult(); 54 result.code = ResultEnum.SUCCESS.getCode(); 55 result.message = message; 56 result.data = data; 57 return result; 58 } 59 60 /** 61 * 返回无需data的成功结果实体 62 * 63 * @param message 消息内容 64 * @return 返回结果 65 */ 66 public static FrontResult getSuccessResultOnlyMessage(String message) { 67 FrontResult result = new FrontResult(); 68 result.code = ResultEnum.SUCCESS.getCode(); 69 result.message = message; 70 result.data = null; 71 return result; 72 } 73 74 /** 75 * 获取一个异常结果 76 * 77 * @param code 错误码 78 * @param message 自定义异常信息 79 * @return FrontResult 80 */ 81 public static FrontResult getExceptionResult(Integer code, String message) { 82 FrontResult result = new FrontResult(); 83 result.code = (code == null) ? ResultEnum.CODE_EXCEPTION.getCode() : code; 84 result.message = message.isEmpty() ? ResultEnum.CODE_EXCEPTION.getMsg() : message; 85 return result; 86 } 87 88 /** 89 * 得到异常结果 90 * 91 * @param resultEnum 枚举结果代码 92 * @return {@link FrontResult} 93 */ 94 public static FrontResult getExceptionResult(ResultEnum resultEnum) { 95 FrontResult result = new FrontResult(); 96 Integer code = resultEnum.getCode(); 97 String msg = resultEnum.getMsg(); 98 result.code = (code == null) ? ResultEnum.CODE_EXCEPTION.getCode() : code; 99 result.message = msg.isEmpty() ? ResultEnum.CODE_EXCEPTION.getMsg() : msg;100 return result;101 }102 }
统一封装一下枚举类型ResultEnum
import lombok.AllArgsConstructor;/** * 结果枚举 * * @author longjun * @date 2023/04/11 */@AllArgsConstructorpublic enum ResultEnum { /** * 成功 */ SUCCESS(200, "操作成功"), /** * 代码异常 */ CODE_EXCEPTION(500, "后端代码内部异常"), /** * 参数错误 */ PARAMETER_ERROR(999, "前端入参异常"), /** * 失败 */ FAIL(1111, "后端代码异常异常"), /** * 空点 */ NULL_POINT(1000, "空指针异常"), /** * 指数误差 */ OUT_OF_INDEX_ERROR(1001, "索引越界异常"), /** * 模型零 */ MODEL_NULL(1002, "前端入参实体的实体为空"), /** * 数据库错误 */ DATABASE_ERROR(1003, "数据库异常"), /** * 身份验证错误 */ AUTHENTICATION_ERROR(1004, "身份验证异常"), /** * 逻辑错误 */ LOGIC_ERROR(1005, "业务逻辑异常"), /** * 类没有找到 */ CLASS_NOT_FOUND(1006, "类未找到异常"), /** * sql异常 */ SQL_EXCEPTION(1007, "sql语句异常"), /** * io例外 */ IO_EXCEPTION(1008, "io异常"), /** * json解析错误 */ JSON_PARSE_ERROR(1009, "json转换异常"), NUMBER_FORMAT_ERROR(1010, "String转换为数字错误"), /** * 更新失败 */ UPDATE_FAIL(1011, "更新失败"), /** * 发送POST错误 */ SEND_POST_ERROR(1012, "发送POST请求异常"), /** * 短信发送错误 */ SMS_SEND_ERROR(1013, "短信发送失败"); /** * 状态码 */ private Integer code; public Integer getCode() { return code; } ResultEnum(Integer code) { this.code = code; } private String msg; public String getMsg() { return msg; }}
基本的类型封装好了,接下来就是重头戏,关键代码也在这里。主要就是实现了ResponseBodyAdvice接口,其实是对加了@RestController(也就是@Controller+@ResponseBody)注解的处理器将要返回的值进行增强处理。
其实也就是采用了AOP的思想,对返回值进行一次修改。
该接口一共有两个方法:
(1)supports ——判断是否要执行beforeBodyWrite方法,true为执行,false不执行 —— 通过supports方法,我们可以选择哪些类或哪些方法要对response进行处理,其余的则不处理。
(2)beforeBodyWrite —— 对 response 处理的具体执行方法。
1 package com.dlxx.tower.app.config; 2 3 import com.dlxx.tower.app.exception.BizException; 4 import com.dlxx.tower.app.util.FrontResult; 5 import com.fasterxml.jackson.core.JsonProcessingException; 6 import com.fasterxml.jackson.databind.ObjectMapper; 7 import org.springframework.core.MethodParameter; 8 import org.springframework.http.MediaType; 9 import org.springframework.http.converter.HttpMessageConverter;10 import org.springframework.http.server.ServerHttpRequest;11 import org.springframework.http.server.ServerHttpResponse;12 import org.springframework.web.bind.annotation.RestControllerAdvice;13 import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;14 15 /**16 * 响应控制器建议17 *18 * @author longjun19 * @description: 全局处理增强版Controller,避免Controller里返回数据每次都要用响应体来包装20 *21 * @date 2023/04/0422 */23 @RestControllerAdvice(basePackages = {"com.dlxx.tower.app.controller"})24 public class ResponseControllerAdvice implements ResponseBodyAdviceView Code
这样基本上就可以对返回值进行统一封装了,下面就开始介绍全局异常;
统一异常处理:
首先自定义一个异常类型
1 package com.dlxx.tower.app.exception; 2 3 import com.dlxx.tower.app.util.FrontResult; 4 import com.dlxx.tower.app.util.ResultEnum; 5 6 /** 7 * 业务异常 8 * 自定义一个异常类,用于处理我们发生的业务异常 9 *10 * @author longjun11 * @version 1.0.012 * @date 2023/04/0413 */14 public class BizException extends RuntimeException {15 16 private static final long serialVersionUID = 1L;17 18 /**19 * 错误码20 */21 protected Integer errorCode;22 /**23 * 错误信息24 */25 protected String errorMsg;26 27 public BizException() {28 super();29 }30 31 public BizException(FrontResult errorInfoInterface) {32 super(errorInfoInterface.getCode().toString());33 this.errorCode = errorInfoInterface.getCode();34 this.errorMsg = errorInfoInterface.getMessage();35 }36 37 public BizException(FrontResult errorInfoInterface, Throwable cause) {38 super(errorInfoInterface.getCode().toString(), cause);39 this.errorCode = errorInfoInterface.getCode();40 this.errorMsg = errorInfoInterface.getMessage();41 }42 43 public BizException(String errorMsg) {44 super(errorMsg);45 this.errorMsg = errorMsg;46 }47 48 public BizException(Integer errorCode, String errorMsg) {49 super(String.valueOf(errorCode));50 this.errorCode = errorCode;51 this.errorMsg = errorMsg;52 }53 54 public BizException(ResultEnum resultEnum) {55 super(String.valueOf(resultEnum.getCode()));56 this.errorCode = resultEnum.getCode();57 this.errorMsg = resultEnum.getMsg();58 }59 60 public BizException(Integer errorCode, String errorMsg, Throwable cause) {61 super(String.valueOf(errorCode), cause);62 this.errorCode = errorCode;63 this.errorMsg = errorMsg;64 }65 66 67 public Integer getErrorCode() {68 return errorCode;69 }70 71 public void setErrorCode(Integer errorCode) {72 this.errorCode = errorCode;73 }74 75 public String getErrorMsg() {76 return errorMsg;77 }78 79 public void setErrorMsg(String errorMsg) {80 this.errorMsg = errorMsg;81 }82 83 @Override84 public String getMessage() {85 return errorMsg;86 }87 88 @Override89 public Throwable fillInStackTrace() {90 return this;91 }92 93 }View Code
然后就是异常处理类
1 package com.dlxx.tower.app.config; 2 3 import com.dlxx.tower.app.exception.BizException; 4 import com.dlxx.tower.app.util.FrontResult; 5 import com.dlxx.tower.app.util.ResultEnum; 6 import com.fasterxml.jackson.core.JsonParseException; 7 import lombok.extern.slf4j.Slf4j; 8 import org.springframework.http.converter.HttpMessageNotReadableException; 9 import org.springframework.web.bind.annotation.ExceptionHandler; 10 import org.springframework.web.bind.annotation.ResponseBody; 11 import org.springframework.web.bind.annotation.RestControllerAdvice; 12 13 import javax.servlet.http.HttpServletRequest; 14 import java.io.IOException; 15 import java.sql.SQLException; 16 17 /** 18 * 全局异常处理程序 19 *View Code20 * 统一异常处理 21 * 使用该注解表示开启了全局异常的捕获 22 * 23 * @author longjun 24 * @version 1.0.0 25 * @date 2023/04/04 26 */ 27 @RestControllerAdvice 28 @Slf4j 29 public class GlobalExceptionHandler { 30 31 /** 32 * 处理自定义的业务异常 33 * 34 * @param req 35 * @param e 36 * @return 37 */ 38 @ExceptionHandler(value = BizException.class) 39 @ResponseBody 40 public FrontResult bizExceptionHandler(HttpServletRequest req, BizException e) { 41 log.error("URL : " + req.getRequestURL().toString()); 42 log.error("HTTP_METHOD : " + req.getMethod()); 43 log.error("发生业务异常!原因是:{}", e.getErrorMsg()); 44 return FrontResult.getExceptionResult(e.getErrorCode(), e.getErrorMsg()); 45 } 46 47 /** 48 * 处理空指针的异常 49 * 50 * @param req 51 * @param e 52 * @return 53 */ 54 @ExceptionHandler(value = NullPointerException.class) 55 @ResponseBody 56 public FrontResult exceptionHandler(HttpServletRequest req, NullPointerException e) { 57 log.error("URL : " + req.getRequestURL().toString()); 58 log.error("HTTP_METHOD : " + req.getMethod()); 59 log.error("发生空指针异常!原因是:", e); 60 return FrontResult.getExceptionResult(ResultEnum.NULL_POINT); 61 } 62 63 64 /** 65 * 处理索引越界异常 66 * 67 * @param req 68 * @param e 69 * @return 70 */ 71 @ExceptionHandler(value = IndexOutOfBoundsException.class) 72 @ResponseBody 73 public FrontResult exceptionHandler(HttpServletRequest req, IndexOutOfBoundsException e) { 74 log.error("URL : " + req.getRequestURL().toString()); 75 log.error("HTTP_METHOD : " + req.getMethod()); 76 log.error("索引越界异常!原因是:", e); 77 return FrontResult.getExceptionResult(ResultEnum.OUT_OF_INDEX_ERROR); 78 } 79 80 /** 81 * 处理类未找到异常 82 * 83 * @param req 84 * @param e 85 * @return 86 */ 87 @ExceptionHandler(value = ClassNotFoundException.class) 88 @ResponseBody 89 public FrontResult exceptionHandler(HttpServletRequest req, ClassNotFoundException e) { 90 log.error("URL : " + req.getRequestURL().toString()); 91 log.error("HTTP_METHOD : " + req.getMethod()); 92 log.error("发生类未找到异常!原因是:", e); 93 return FrontResult.getExceptionResult(ResultEnum.CLASS_NOT_FOUND); 94 } 95 96 97 /** 98 * 处理SQL异常 99 *100 * @param req101 * @param e102 * @return103 */104 @ExceptionHandler(value = SQLException.class)105 @ResponseBody106 public FrontResult exceptionHandler(HttpServletRequest req, SQLException e) {107 log.error("URL : " + req.getRequestURL().toString());108 log.error("HTTP_METHOD : " + req.getMethod());109 log.error("发生SQL异常!原因是:", e);110 return FrontResult.getExceptionResult(ResultEnum.SQL_EXCEPTION);111 }112 113 /**114 * 处理IO异常115 *116 * @param req117 * @param e118 * @return119 */120 @ExceptionHandler(value = IOException.class)121 @ResponseBody122 public FrontResult exceptionHandler(HttpServletRequest req, IOException e) {123 log.error("URL : " + req.getRequestURL().toString());124 log.error("HTTP_METHOD : " + req.getMethod());125 log.error("发生IO异常!原因是:", e);126 return FrontResult.getExceptionResult(ResultEnum.IO_EXCEPTION);127 }128 129 130 /**131 * json转换异常处理程序132 *133 * @param req 要求事情134 * @param e e135 * @return {@link FrontResult}136 */137 @ExceptionHandler(value = JsonParseException.class)138 @ResponseBody139 public FrontResult exceptionHandler(HttpServletRequest req, JsonParseException e) {140 log.error("URL : " + req.getRequestURL().toString());141 log.error("HTTP_METHOD : " + req.getMethod());142 log.error("发生JSON转换异常!原因是:", e);143 return FrontResult.getExceptionResult(ResultEnum.JSON_PARSE_ERROR);144 }145 146 /**147 * String转数字异常处理程序148 *149 * @param req 要求事情150 * @param e e151 * @return {@link FrontResult}152 */153 @ExceptionHandler(value = NumberFormatException.class)154 @ResponseBody155 public FrontResult exceptionsHandler(HttpServletRequest req, NumberFormatException e) {156 log.error("URL : " + req.getRequestURL().toString());157 log.error("HTTP_METHOD : " + req.getMethod());158 log.error("发生String转数字异常!原因是:", e);159 return FrontResult.getExceptionResult(ResultEnum.NUMBER_FORMAT_ERROR);160 }161 162 /**163 * 前端参数不匹配异常处理程序164 *165 * @param req 要求事情166 * @param e e167 * @return {@link FrontResult}168 */169 @ExceptionHandler(value = HttpMessageNotReadableException.class)170 @ResponseBody171 public FrontResult exceptionsHandler(HttpServletRequest req, HttpMessageNotReadableException e) {172 log.error("URL : " + req.getRequestURL().toString());173 log.error("HTTP_METHOD : " + req.getMethod());174 log.error("发生前端参数不匹配异常!原因是:", e);175 return FrontResult.getExceptionResult(ResultEnum.PARAMETER_ERROR);176 }177 178 /**179 * 处理其他异常180 *181 * @param req182 * @param e183 * @return184 */185 @ExceptionHandler(value = Exception.class)186 @ResponseBody187 public FrontResult exceptionHandler(HttpServletRequest req, Exception e) {188 log.error("URL : " + req.getRequestURL().toString());189 log.error("HTTP_METHOD : " + req.getMethod());190 log.error("未知异常!原因是:", e);191 return FrontResult.getExceptionResult(ResultEnum.FAIL);192 }193 194 195 }
这里就已经可以实现这两个功能了
需要我们触发异常的时候就可以直接这样用
throw new BizException(ResultEnum.AUTHENTICATION_ERROR.getCode(), "验证码校验失败。");
第一个参数就是我们封装的枚举,第二个就是自定义的信息,当然也可以直接用枚举,这些都可以自己修改的。
关键词:
-
全球即时:python的matplotlib绘制动态图形(用animation中的FuncAnimation)
%matplotlibauto 数据透视表: 统计各月每天的刷卡金额之和 month_day_df=pd pivot_table(data_df,values="刷卡金额&quo
来源: 【天天时快讯】springboot统一响应实体封装+统一异常类管理
当前观察:Redis---哨兵服务
全球即时:python的matplotlib绘制动态图形(用animation中的FuncAnimation)
财政部:将专项债务限额及时下达各地 推动尽快形成实物工作量
世界看热讯:在史上“最热闹”的上海车展 特斯拉竟然缺席了 维权有阴影?
漫威面临征服者康难题
世界微头条丨爆款狂促!玫瑰精油洗发水47.8元买1000ml:解决软塌油头
焦点观察:王一博主演!《长空之王》领跑五一档预售票房榜
72岁王石出手创立私募基金:曾表态市场一定会惩罚暴利
方萍萍:2023年04月18日原油交易策略
秦昊结了几次婚?秦昊的老婆叫什么名字?
罗云熙真实身高体重是多少?罗云熙为什么那么瘦?
粉红法拉利是谁唱的?粉红法拉利完整版歌词
化骨绵掌是什么意思?化骨绵掌是谁的绝招?
车俊焕多大了?车俊焕个人资料介绍
【世界报资讯】Go 单表头结构体导入导出
世界看点:nginx服务在高并发场景下的优化方案及具体配置
今日观点!兔子产子问题
关注:大连积极扩大有效投资加速迈向“万亿GDP城市”
【财经分析】紧缩预期压制买需 2月超六成海外“债主”抛售美债
视讯!新华社重庆分社社长李勇:将从三方面助力重庆数字政府建设
首批扩募REITs将召开持有人大会
每日热议!生产力起飞!金山官宣WPS AI:聊天帮忙做好Word文档
环球今日报丨发布三个月跳水超1000!苹果M2版Mac mini降到3478元了
全球快资讯:上海一物流网点起火:快递员怀疑液体可燃 用打火机尝试发现真的可燃
今晚发布!小米13 Ultra配置带你提前看 就差价格了
全球快看:AI绘制90年代“复仇者联盟” 阿汤哥来演钢铁侠
世界速看:uniapp ios app离线打包
如何假装你懂Meta Segment Anything?
前沿资讯!基础电子元器件产业发展专项协调机制年度工作会议在深圳召开
【全球时快讯】游戏掉帧电脑卡顿?这锅CPU不背
四电机原地掉头 奔驰EQG概念车亮相上海车展:全新电池装车
理想汽车累计交付破32万辆 30万元以上新能源品牌销量第一
全球短讯!像人一样开 理想发布理想AD Max 3.0:连路上的狗都能识别
世界新资讯:iPhone 15 Pro新变化:用音量键组合关机重启成过去式
福建省厦门市发布雷雨大风黄色预警
【全球聚看点】如何在 Linux 上录制你的终端操作
dbatools demo
当前速递!一段话理解正向代理和反向代理的区别
热头条丨大数据开发相关技术汇总
环球热消息:6月6日全平台发售!《暗黑破坏神4》已完成开发:送厂压盘
蒙古国发布强沙尘暴预警:今日起席卷全境 影响我国部分地区
天天观热点:抢先看!迪士尼送真人版《小美人鱼》新预告:黑小美人鱼水中甩发画面动情
环球微资讯!蒙古国发布强沙尘暴预警 18日起将席卷全境
债务违约担忧加剧 美国3个月期国库券中标收益率超5%
天天热点!探营2023上海车展:一场新能源和智能化技术的盛宴
【环球报资讯】293份一季报预告逾七成预喜 机械设备等赛道业绩亮眼
【天天聚看点】坐地铁被收15元“超时费”?网友吵翻
环球聚焦:长荣航空两飞机发生碰撞:空客A321把波音777“割喉”了
女子骑摩托车遇沉降路段摔倒遭碾压身亡 竟担主责引争议:网友吵翻
比亚迪汽车APP升级7.0版本:界面全新改版 美观太多了
焦点热议:饲养员用竹竿打大熊猫“暖暖” 园方回应:永不允许此人养熊猫
当前快看:【长测】小米蒸烤箱维修记录:不到一年半就坏了
【天天聚看点】大批“学生特种兵”留宿淄博海底捞:出示车票即可
2023年农牧行业6大CRM系统、5大场景盘点
React 组件进入和退出动画实现
又一家果链代工巨头被苹果拖累 歌尔业绩暴雷:利润暴跌近90%
焦点热议:华为首发L2.9999 新势力们开始卷技术了?
【全球速看料】提前泄密上海车展:没想到 全是黑幕!
世界微动态丨SNK正版授权!腾讯《合金弹头:觉醒》今日上线:iPhone 5S也能玩
歼20看个爽!《长空之王》4月28日上映:影片时长128分钟
环球快资讯丨意外的幸运签资源 意外的幸运签百度云
每日热议!【商会】秘书长陈晓虹走访优秀在粤浙商企业东阳光集团——科技兴企 创新发展
【世界聚看点】面试题百日百刷-kafka篇(四)
天天速看:docker部署gitlab CI/CD (一)第一篇:部署gitlab及汉化
【世界独家】SpaceX星舰发射计划推迟:马斯克公布原因!下次时间待定
马斯克回应SpaceX星舰发射计划推迟:今天学到了很多
今日热议:欧体化度寺碑(关于欧体化度寺碑介绍)
当前热议!《复仇者联盟:无限战争》剪掉45分钟灭霸剧情 团灭山达尔星
全球热消息:网剧《长月烬明》豆瓣开分6.2分 官方曾辟谣抄袭《仙剑三》
气温大跳水!新一股强冷空气将带来俯冲式降温:局地累计降温超25度
超越土星5号登月火箭 人类最强火箭星舰又跳票了:最后40秒多取消
ChatGPT如何助力IT从业者?如何让ChatGPT帮助我们变现赚钱?
package.json 备忘清单_开发速查表分享
天天百事通!Redis---数据持久化之RDB与AOF
当得知身边同事好几个千万富翁……
观热点:一图看懂一加Ace 2原神定制礼盒:3699元限量 手慢无
今日聚焦!自动驾驶是忽悠?余承东反击王传福:可能这方面没做好
世界微头条丨60岁老汉吃半个杨桃休克抢救1周 医生提醒这类人要少吃
Intel Arc显卡驱动势头迅猛:更新比友商还勤快 性价比绝尘
11号色靓丽吸睛!华为nova 11 Ultra图赏
第十四届蓝桥杯赛前准备资料存档
在SSMS中连接到Dynamics 365 online需要进行以下步骤
每日热点: 1盒不到3元!特仑苏全脂牛奶大促:高蛋白 易吸收
天天快看:载孕妇Model 3方向盘突然抱死!特斯拉回应:组件故障 可退车
破天荒!苹果迫于欧盟法规:将在iOS 17上首次允许第三方应用商店
视频火了!吃面崩溃女生回应:生气因对象觉得丢人
全球今日报丨女主播车祸致面部伤残7级:保险公司被判赔部分整容费用
世界观速讯丨洛阳市老旧小区改造标准进一步细化
每日速讯:ASP.NET Core MVC 从入门到精通之布局
世界看点:记忆大师课程视频
世界信息:gRPC入门
速看:债市日报:4月17日
天天观天下!轮子只能是圆的?这辆方轮自行车颠覆你的固有印象
环球热消息:对比特斯拉遥遥领先!华为智能驾驶系统ADS 2.0发布:3.6万元
全球速看:最大720kW!华为发布新一代全液冷超充架构充电解决方案:即充即走
当前资讯!1TB“白菜价”!真我GT Neo5 SE成了:在京东平台比iPhone 14 Pro更火
世界报道:高端旗舰手机为何能卖这么贵?一分钱一分货真没错
普法宣传在身边,警民携手筑平安
视讯!人人尽享的低代码,会不会是下一个“财富密码”?