首页 文章 精选 留言 我的

精选列表

搜索[web],共10000篇文章
优秀的个人博客,低调大师

Java Web 服务器 wastnet mvc 开发实战

用 wastnet MVC 写接口服务(实战教程) wastnet 是一款完全自研、零第三方依赖的轻量级 Java 网络应用框架,核心基于 JDK 原生 NIO 构建 Reactor 多路复用模型,HTTP/2 协议栈从 HPACK、Huffman 到 ALPN 均为自主实现。其 wastnet-mvc 模块在核心之上提供注解驱动的 MVC / 轻量 IoC 能力:@Controller、@Endpoint、@ResponseBody、参数绑定(@PathParam / @RequestParam / @RequestHeader / @RequestBody)、HttpMessageConverter、拦截器与 SSE 等一应俱全。本文以项目内置的 MvcDemo 为例,带你从零跑通一个完整的接口服务。 1. 引入依赖 只需引入 wastnet-mvc(它会自动依赖 wastnet-core),基础场景引入 wastnet-core 即可,二者二选一。 <dependency> <groupId>io.github.wycst</groupId> <artifactId>wastnet-mvc</artifactId> <version>1.0.2</version> </dependency> HttpMessageConverter 的 JSON 读写需要自行实现。示例中使用 io.github.wycst:wast 提供的 io.github.wycst.wast.json.JSON(需单独引入,也可替换为 Jackson 等任意 JSON 库);若用到模板视图渲染(如 FreeMarker)再按需引入对应库。 <!-- JSON 序列化(示例用,可替换为 Jackson 等) --> <dependency> <groupId>io.github.wycst</groupId> <artifactId>wast</artifactId> <version>0.0.29.1</version> </dependency> 2. 三行启动一个 MVC 服务 核心是 AnnotationRouterHandler:扫描包下的 @Controller,再把路由器挂到 HTTPServer 上。 AnnotationRouterHandler router = new AnnotationRouterHandler() .scanPackages("com.demo.controller"); // 扫描你的控制器包 HTTPServer.of(8080) .requestHandler(router) .start(); MvcDemo 在此基础上叠加了 JSON 转换器、视图解析器、属性与配置文件,稍后逐步展开。 3. 第一个 Controller @Controller 声明控制器,@Endpoint 映射路径,@ResponseBody 表示返回值直接写回(有 HttpMessageConverter 时自动序列化)。@RestController 等价于 @Controller + 默认 @ResponseBody。 @Controller("/api/user") public class UserController { @ResponseBody @Endpoint("/list") public String list() { return userService.listUsers(); } } 访问 GET /api/user/list 即返回字符串内容。 4. 参数绑定 4.1 路径变量 @PathParam wastnet 同时支持两种语法:${id}(自有写法)与 {uid}(Spring 风格)。 @Endpoint("/user/${id}") public Object a(@PathParam("id") long id) { ... } @Endpoint("/profile/{uid}") public Object b(@PathParam("uid") long uid) { ... } 4.2 请求参数 @RequestParam 支持标量、默认值、同名多值与文件上传(MultipartField)。 @Endpoint("/search") public Object search(@RequestParam("q") String q, @RequestParam(value = "page", required = false, defaultValue = "1") int page, @RequestParam(value = "size", required = false, defaultValue = "10") int size) { // ... } @Endpoint(value = "/upload", allowMethods = HttpMethod.POST) public Object upload(@RequestParam("file") MultipartField file) { if (file != null && file.isFile()) { return file.getFileName() + ", " + file.size(); } return "no file"; } 4.3 请求头 @RequestHeader @Endpoint("/hdr-single") public Object single(@RequestHeader("X-Client") String client) { ... } @Endpoint("/hdr-multi") public Object multi(@RequestHeader("X-Tags") String[] tags) { ... } @Endpoint("/hdr-default") public Object withDefault(@RequestHeader(value = "X-Env", required = false, defaultValue = "dev") String env) { ... } 支持单值、多值(String[])、非必填 + 默认值、类型转换(如 int)。 4.4 请求体 @RequestBody 配合 HttpMessageConverter,请求体 JSON 自动反序列化为 POJO。 public class CreateUserReq { public int id; public String name; } @Endpoint("/create") public String create(@RequestBody CreateUserReq req) { return userService.getUserName(req.id); } 5. 返回值与 JSON 序列化 方法返回对象(非 void)时,由注册的 HttpMessageConverter 负责写出。下面是 MvcDemo 里用框架内置 JSON 实现的转换器: AnnotationRouterHandler router = new AnnotationRouterHandler() .messageConverter(new HttpMessageConverter() { public void write(Object value, ConverterConfig config, HttpResponse response) throws Exception { response.contentType(config.getResponseContentType()); response.body(config.isPretty() ? JSON.toPrettifyJsonString(value) : JSON.toJsonBytes(value)); } public Object read(HttpRequest request, ConverterConfig config, Type type) throws Exception { // 从请求体反序列化(流或字节)为 type 类型 ... } }); @ResponseBody 或 @RestController 标注的端点,返回值即走该转换器;未标注 @ResponseBody 且返回非 void 时,则交给视图解析器(见第 9 节)。 6. 轻量 DI @Component 注册托管组件,@Inject 按类型注入,@Value 注入配置,@PostConstruct / @PreDestroy 管理生命周期;@Configuration + @Bean 提供工厂式 Bean。 @Component public class UserService { @Value("${app.prefix:User-}") private String namePrefix; @PostConstruct public void init() { /* 初始化 */ } public String getUserName(int id) { return namePrefix + id; } } @Controller("/api/user") public class UserController { @Inject private UserService userService; // 自动注入 } @Configuration public class TestConfiguration { @Bean public CreateUserReq createUserReq() { return new CreateUserReq(); } } 7. 拦截器 实现 RouterInterceptor 并标 @Interceptor 即可被自动注册。不带 type 的是全局拦截器;type = ENDPOINT 的是端点级拦截器,需配合 @WithInterceptor 引用才生效。 // 全局拦截器:打印请求日志 @Interceptor(order = 1) public class AuthLogInterceptor implements RouterInterceptor { public boolean beforeHandle(String path, HttpRequest request, HttpResponse response) { System.out.println("[" + request.getMethod() + "] " + path); return true; // 返回 false 将中断请求 } } // 端点级拦截器:校验角色 @Interceptor(value = "admin", order = 1, type = InterceptorType.ENDPOINT) public class AdminAuthInterceptor implements RouterInterceptor { public boolean beforeHandle(String path, HttpRequest request, HttpResponse response) { if (!"admin".equals(request.getHeader("X-Role"))) { response.status(403).body("Forbidden: admin role required"); return false; } return true; } } // 引用端点级拦截器(类级作用于全部端点,方法级追加) @RestController("/admin") @WithInterceptor("admin") public class AdminController { @Endpoint("/users") public String users() { return "admin user list"; } } 8. SSE 服务端推送 @Sse 方法返回 void,并恰好包含一个 SseEmitter 参数(其余 @PathParam / @RequestParam 等照常解析)。用 emitter.emit(...) 推送事件。 @Controller public class SseDemoController { @Sse("/sse-clock") public void clock(SseEmitter emitter) throws IOException { for (int i = 1; i <= 5; i++) { emitter.emit("tick-" + i); // 仅 data Thread.sleep(1000); } // 方法返回后框架自动关闭连接,无需手动 close } @Sse("/sse/room/${roomId}") public void room(@PathParam("roomId") long roomId, SseEmitter emitter) throws IOException { emitter.emit("room-" + roomId + "-msg"); } @Sse("/sse-full") public void full(SseEmitter emitter) throws IOException { emitter.emit("greeting", "hello", "evt-1", 3000); // event/data/id/retry } } 说明:@Sse 方法执行完毕后,框架在 finally 中自动关闭连接并释放资源;也可主动调用 emitter.close()(幂等)。客户端用 curl -N 或 EventSource 消费,例如 curl -N http://localhost:8080/sse/room/100。 9. 视图渲染(可选) 未标注 @ResponseBody 且返回非 void 时,返回值交给注册的 ViewResolver。实现 ViewResolver 接口(supports + render),再 addViewResolver(...) 注册即可。 AnnotationRouterHandler router = new AnnotationRouterHandler() .addViewResolver(new FreeMarkerViewResolver()); // 返回 ModelAndView 时按模板渲染 MvcDemo 中 /demo/view/user 即走 FreeMarker 模板渲染为 HTML;纯接口场景可忽略本节。 10. 开发热重载 开发阶段修改 Controller / 配置后无需重启服务,wastnet 内置的 DevHotReloader 会自动重载。它在主类从目录(而非 jar)加载的开发环境下自动启用,监听编译输出目录: 触发:.class 文件变更(默认去抖 1000ms,可用 -Dwastnet.http.hot-reload.debounce=ms 调整);configFiles 指向的配置文件变更也会触发。 机制:每次重载重建子 ClassLoader 只指向项目编译产物,库与框架类委托父加载器,因此重编译的 .class 从磁盘重新读取,注解身份保持稳定。 范围:只清理扫描产物(HTTP / SSE 路由、WebSocket、拦截器、扫描 Bean),保留手工注册的路由;@PreDestroy 先执行再重建。 容错:重载失败会保留上一次状态并打印错误,不会让服务崩溃。 router.hotReload(false); // 关闭热重载 router.hotReload(true, false); // 开启热重载但静音(第二个参数控制是否打印日志) router.hotReloadWatchExclude("com.example.stable"); // 排除稳定包不参与重载 控制台会打印类似:[dev] hot reload: ReloadController.class changed, reloading... → [dev] hot reload: OK reloaded in 36 ms。以 jar 方式运行时不启用热重载。 11. 完整启动与验证 MvcDemo.main 把以上能力串起来:开启 H2 监控、注册 JSON 转换器与视图解析器、注入属性 app.prefix、扫描包、启动服务器(可选 pemSSL + h2 启用 HTTPS/h2)。 public static void main(String[] args) throws Exception { AnnotationRouterHandler router = new AnnotationRouterHandler() .messageConverter(/* 见第 5 节 */) .addViewResolver(new FreeMarkerViewResolver()) .property("app.prefix", "Member-") .scanPackages("io.github.wycst.wastnet.examples.http.mvc") .configFiles("demo.properties"); HTTPServer server = HTTPServer.of(8080) .requestHandler(router) .startupBannerEnabled(true); server.pemSSL("cert/cert.pem", "cert/server.pem").h2(); // 可选:启用 HTTPS/h2 server.start(); } 启动后部分可用端点: 端点 说明 GET /api/user/list 返回用户列表(字段注入 + DI) GET /api/user/get?id=42 按 id 查询 GET /demo/user/${id} / /profile/{uid} 两种路径变量语法 GET /demo/search?q=x&page=2 @RequestParam 默认值 POST /demo/upload 单文件上传(MultipartField) GET /hdr-single(X-Client: curl) @RequestHeader 绑定 GET /sse-clock SSE 每秒推送(curl -N) GET /admin/users(X-Role: admin) 端点级拦截器保护 12. 与 Spring MVC 对比:上手更容易 如果你用过 Spring MVC,会发现 wastnet MVC 的注解几乎一一对应,迁移成本极低: wastnet 注解 Spring 等价 说明 @Controller @Controller 类级,value() 为 base path @RestController @RestController 等价于 @Controller + 类级 @ResponseBody @Endpoint @RequestMapping / @GetMapping… 方法级路由,allowMethods 限定方法 @Component / @Configuration+@Bean 同名 托管组件与工厂 Bean @Inject @Autowired 按类型注入 @Value @Value ${key:default} 占位符 @PathParam / @RequestParam / @RequestBody / @RequestHeader @PathVariable / @RequestParam / @RequestBody / @RequestHeader 参数绑定 @PostConstruct / @PreDestroy javax.annotation.* 生命周期回调(框架自带,无需额外依赖) @Interceptor + @WithInterceptor HandlerInterceptor 路由级拦截 上手更容易体现在几个方面: 零容器负担:无需引入 Spring 容器、无 starter 依赖爆炸、无版本冲突风险。一个 wastnet-mvc 依赖 + 几行 main 就能跑起一个支持 HTTP/2、SSL、SSE 的服务,不必配置 DispatcherServlet、嵌入式 Tomcat 或一堆自动配置。 开箱即用的网络能力:HTTP/2、PEM 直载 SSL、@Sse 服务端推送、开发热重载都是框架内置,不依赖额外中间件或第三方库。 轻量 DI:@Component / @Inject / @Value 即可完成大部分场景,没有复杂的 Bean 生命周期与代理体系。 平滑迁移:通过 annotationResolver(...) 还能桥接 Spring 的 @RestController / @RequestMapping / @Service / @Autowired / @Value,现有 Spring 注解代码几乎不用改。 相关链接 Gitee:https://gitee.com/xiaoch0209/wastnet GitHub:https://github.com/wycst02/wastnet 协议:Apache License 2.0 完整示例见 wastnet-test 模块下的 examples/http/mvc。 完整文档引用 本文为实战速览,注解 MVC 的完整用法见官方文档:annotation-mvc-guide.md。

优秀的个人博客,低调大师

Mapbox GL JS 3.27.0 发布,WEB GIS 开发框架

Mapbox GL JS 3.27.0 现已发布,此版本更新内容包括: Features and improvements 升级到 TypeScript 7 为 symbols 添加 cross-source HD roadselevation 改进垂直文本渲染模式下部分中日韩字符的旋转逻辑 Bug fixes 修复 non-mecator projections 的栅格数组越界断言错误 修复在表达式中使用对象属性字符串时出现的错误 修复多地图环境中使用的错误访问令牌 修复了number-format在min/max-fraction-digits 为 0 时被省略的问题 在 globe-mercator transition 转换期间修复line-aligned 标签的位置 修复了使用带有原型派生键的样式表达式时发生的崩溃问题。 修复 Atlas 缓存返回其他 scope images 的问题 修复了Style#{get,set,remove}FeatureState方法中,当{target: {layerId}}时,导入图层的目标会根据其自身片段的源进行解析,而非根样式的情况 修复缺失的 building along tile borders。 修复 UMD 中的动态导入 修复在现代打包程序下 import.meta 崩溃的问题 修复了过渡时长为 0 的符号属性调用setPaintProperty时的问题 更新说明:https://github.com/mapbox/mapbox-gl-js/releases/tag/v3.27.0

优秀的个人博客,低调大师

Python 快速开发Web文件服务器

![](https://developer.qcloudimg.com/http-save/yehe-11081884/46d54d0bd585a61be2d334caf609a874.jpg) ### **一、基于标准库的实现(python自带零依赖)** 使用**Python**内置的**http.server**和**cgi**模块实现,适合快速部署内网文件共享服务。 ``` import http.server import cgi import os import sys from urllib.parse import urlparse, unquote class FileHandler(http.server.BaseHTTPRequestHandler): UPLOAD_DIR = 'uploads' # 上传目录配置 def send_html_header(self): """发送 HTML 响应头""" self.send_response(200) # 设置响应状态码为 200(OK) self.send_header('Content-type', 'text/html; charset=utf-8') # 设置响应内容类型为 HTML self.end_headers() # 结束响应头 def do_POST(self): # 解析表单数据(含文件) form = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD': 'POST'} ) # 获取上传文件并保存 file_item = form['file'] if file_item.filename: file_path = os.path.join(self.UPLOAD_DIR, os.path.basename(file_item.filename)) with open(file_path, 'wb') as f: f.write(file_item.file.read()) self.send_redirect('/') # 上传后返回首页 def do_GET(self): # 文件下载处理 if self.path.startswith('/download/'): file_path = os.path.join(os.getcwd(), unquote(self.path[9:])) if os.path.isfile(file_path): self.send_header('Content-Disposition', f'attachment; filename="{os.path.basename(file_path)}"') with open(file_path, 'rb') as f: self.wfile.write(f.read()) # 显示文件列表 else: self.send_html_header() self.wfile.write(self.generate_file_list().encode('utf-8')) def generate_file_list(self): """生成带上传表单的文件列表HTML""" files = os.listdir(self.UPLOAD_DIR) html = f""" 文件列表 {"".join(f'{f}' for f in files)} """ return html if __name__ == '__main__': os.makedirs(FileHandler.UPLOAD_DIR, exist_ok=True) port = 8000 if len(sys.argv) ') def download_file(filename): try: return send_from_directory( app.config['UPLOAD_FOLDER'], filename, as_attachment=True ) except FileNotFoundError: abort(404) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) ``` 配套模板文件**(templates/index.html):** ``` 文件服务器 body { font-family: Arial, sans-serif; margin: 20px; } table { width: 100%; border-collapse: collapse; } th, td { padding: 8px; text-align: left; border-bottom: 1px solid #ddd; } th { background-color: #f2f2f2; } .upload-form { margin: 20px 0; } 文件服务器 上传文件 上传 文件列表 文件名 大小 (字节) 修改时间 操作 {% for file in files %} {{ file.name }} {{ file.size }} {{ file.modified|datetime }} 下载 {% endfor %} ``` **使用说明:** 1、安装库:**pip install flask werkzeug** 2、运行服务:**python file_server.py** 3、访问地址:**http://localhost:5000** 4、扩展: **1)安全增强**(在**Flask**中实现) ``` # 文件类型白名单 ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS # 在上传路由中添加检查 if file and allowed_file(file.filename): file.save(...) else: return "文件类型不允许", 400 ``` **2)大文件分块上传**(使用**Flask**) ``` @app.route('/chunk_upload', methods=['POST']) def chunk_upload(): chunk = request.files['chunk'] chunk_number = request.form['chunkNumber'] filename = request.form['filename'] # 创建临时目录存储分块 temp_dir = os.path.join(UPLOAD_FOLDER, 'temp', filename) os.makedirs(temp_dir, exist_ok=True) # 保存分块 chunk.save(os.path.join(temp_dir, chunk_number)) # 合并检测(当收到最后一块时) if int(chunk_number) == int(request.form['totalChunks']) - 1: merge_chunks(filename) return 'OK' ``` **3)添加基础认证**(使用装饰器) ``` from functools import wraps def auth_required(f): @wraps(f) def decorated(*args, **kwargs): auth = request.authorization if auth and auth.username == 'admin' and auth.password == 'secret': return f(*args, **kwargs) return ('Unauthorized', 401, {'WWW-Authenticate': 'Basic realm="Login Required"'}) return decorated # 在路由上添加装饰器 @app.route('/') @auth_required def index(): ... ``` ### **4)部署建议** **(1)开发环境**:直接运行**Flask**应用**(app.run())** **(2)生产环境**: - 使用**Gunicorn**部署:**gunicorn -w 4 app:app** - 配置**Nginx**反向代理(增加文件上传大小限制): ``` server { listen 80; client_max_body_size 100M; # 允许100MB大文件 location / { proxy_pass http://localhost:8000; } } ``` **(3)安全配置**: - 禁用目录遍历:在文件列表生成时过滤敏感文件。 - 设置文件大小上限:**app.config[’MAX_CONTENT_LENGTH’] = 100 * 1024 * 1024。** - 定期清理上传目录。 标准库**http.server**方案适合快速临时、内网快速共享,**Flask**方案更适合长期稳定运行的服务,适合生产环境/复杂需求。可根据需求灵活选择。 **“无他,惟手熟尔”!**有需要的用起来。 **如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐**❤!

优秀的个人博客,低调大师

Mapbox GL JS 3.25.0 发布,WEB GIS 开发框架

Mapbox GL JS 3.25.0 现已发布,此版本更新内容包括: Breaking changes 将 ESM entry point切换为命名导出(import * as mapboxgl from 'mapbox-gl/esm'),以便现代打包工具能够移除少量未使用的代码。将mapboxgl.accessToken替换为MapaccessToken选项。虽然大部分打包内容仍然无法静态删除,但此版本也改进了运行时代码的延迟加载,后续还将推出更多改进。 Features and improvements 扩展MapgetLayerProperty和setLayerProperty并支持层级属性(minzoom,maxzoom,filter,slot,appearances) 扩展TileProviderAPI 使其支持raster和raster-demprovider使用ImageBitmap。 提高模型加载和渲染性能。 提高符号渲染性能。 提高 vector tiles 和其他 protobuf 编码资源的解码和编码性能。 提高颜色解析性能,略微缩短具有许多颜色值的样式的加载时间。 提取室内部分模型渲染代码,以便在使用 ESM entry point 时按需加载。 为 GeolocateControl 添加 ready 事件,并新增 setShowAccuracyCircle、setShowUserHeading、setFitBoundsOptions、setShowUserLocation 方法。 为 KeyboardHandler 添加 disablePan/enablePan 方法。 为 DragRotateHandler 添加 disablePitch/enablePitch 方法。 为 TouchZoomRotateHandler 添加 disableTapDragZoom/enableTapDragZoom 方法。 将 Map 类的 setLanguage、getLanguage、setWorldview、getWorldview 方法设为稳定的公共方法(此前为私有)。 从package.json中移除所有直接依赖项,以略微减小 NPM 安装的大小和时间。 改进带边框线条的抗锯齿效果。 实现常规道路数据和高清道路数据的自动合并,为未来 Mapbox Standard 的更新做好准备。 错误修复 修复了有时会出现黑框而不是符号图标的问题。 修复了高架道路图块边界的精度问题。 修复堆叠式地下道路的渲染问题。 修复与来自不受信任的样式或图块的对象原型污染相关的轻微漏洞。 修复Standard style中的Cutoff is currently disabled on terrain警告。 修复外观条件验证,使其能够接受复合表达式。 修复通过model-line-cutout-mode属性实现模型抠图淡入淡出的问题。 修复符号图层步长表达式求值的问题。 修复自定义图层渲染与 data-drivenline-emissive-strength并行渲染时出现的问题。 更新说明:https://github.com/mapbox/mapbox-gl-js/releases/tag/v3.25.0

优秀的个人博客,低调大师

Mapbox GL JS 3.18.1 发布,WEB GIS 开发框架

Mapbox GL JS 3.18.1 现已发布,此版本更新内容包括: Features and improvements 为 clip layers 添加支持visibility属性支持。 提升精细数值范围的raster-color精度。 Bug fixes 修复 edge cases 下的 color interpolation throwing 错误。 修复 no icon-size的外观问题。 修复与 elevated raster layers 配合使用时符号消失的问题。 更新说明:https://github.com/mapbox/mapbox-gl-js/releases/tag/v3.18.1

优秀的个人博客,低调大师

Mapbox GL JS 3.18.0 发布,WEB GIS 开发框架

Mapbox GL JS 3.18.0 现已发布,此版本更新内容包括: Features and improvements 为text-field内的图像添加scaleFactor支持。 为GeolocateControl添加showButton选项,可隐藏控制按钮。 为GeolocateControl添加followUserLocation选项和setFollowUserLocation方法,以控制地图是否跟随用户的位置。 改进GeolocateControl超时处理机制。 在外观中添加对text-rotate、text-size和text-offset属性的支持。 为方向光添加shadow-draw-before-layer属性,允许控制图层堆栈中的阴影绘制顺序。 向模型图层添加model-allow-density-reduction属性。 Bug fixes 修复模型层上的交互处理程序无法正常工作的问题。 修复可拉伸图标在未启用icon-text-fit时渲染尺寸错误的问题。 修复icon-size在coalesce表达式中无法正常工作的问题。 修复使用nearestraster-resampling时的raster-color插值问题。 修复 ortho projection 范围内高位栅格图层渲染的渲染截断问题。 修复符号位置问题,包括可选部分和缺失部分。 为GeolocateControl错误事件公开所有错误属性 修复在dynamic: true模式下查询多边形时出现的错误。 修复AttributionControl链接清理问题。 修复模型加载期间通过ModelSource.setModels更新模型源的问题。 在map.getStyle()output 中保留的 featuresets。 ​​​​​​​详情可查看更新说明:https://github.com/mapbox/mapbox-gl-js/releases/tag/v3.18.0

优秀的个人博客,低调大师

RustDesk 1.4.0 远程桌面,全面支持 Web Socket

新增功能 锁屏时允许使用登录屏幕密码 截屏功能 使用主机名作为专业版的标识 Windows 自动更新,Windows 和 Mac 手动更新 所有平台支持 WebSocket 调整触控板速度 #11680 变更 移除 reqwest 的系统代理依赖 显示名称首字母大写 Socks5 代理仅使用 TCP,因为许多用户未能正确设置 UDP,包括我们自己 托盘中的“退出”更改为“停止服务”,以避免混淆 修复 虚拟 F11 键适配 macOS (11366) 托盘启动尝试通过 sudo(被拒绝),导致发送电子邮件 #9802 使用 reqwest 的 Http 代理 隐藏 cm 局域网发现 Rdp #10039 鼠标滚动,远程标签页 #11708 2FA 登录状态 更新说明:https://github.com/rustdesk/rustdesk/releases/tag/1.4.0 顶级 Rust 开源项目期待你的加入,请发送简历到emhvdUBydXN0ZGVzay5jb20gICA=

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册