当前位置: 首页 > news >正文

flutter的web页面

有几个服务器

有几个后台

直接通过web端进去虽然说很方便,但…

于是把web页面镶嵌到应用里面去,

这样就换了个方式打开web页面了

在这里插入图片描述
在这里插入图片描述

比如这里有有个列表
这里是写死了,活的列表可以通过io去获取

import 'package:flutter/material.dart';
import 'one_web.dart';  // 导入浏览器页面,单个页面class ListScreen extends StatelessWidget {// 定义按钮和对应的 URLfinal List<Map<String, String>> buttonUrls = [{'title': 'Google', 'url': 'https://www.google.com'},{'title': 'Baidu', 'url': 'https://www.baidu.com'},{'title': 'GitHub', 'url': 'https://github.com'},{'title': '127.0.0.1:10005/admin', 'url': 'http:127.0.0.1:10005/admin'},{'title': '10.0.2.2:10005/admin', 'url': 'http:10.0.2.2:10005/admin'},{'title': '192.168.1.1:10005/admin', 'url': 'http:192.168.1.1:10005/admin'},{'title': '192.168.1.2:10005/admin', 'url': 'http:192.168.1.2:10005/admin'},{'title': '192.168.1.3:10005/admin', 'url': 'http:192.168.1.3:10005/admin'},{'title': '192.168.1.4:10005/admin', 'url': 'http:192.168.1.4:10005/admin'},{'title': '192.168.1.5:10005/admin', 'url': 'http:192.168.1.5:10005/admin'},{'title': '192.168.1.6:10005/admin', 'url': 'http:192.168.1.6:10005/admin'},// 添加更多按钮和 URL];Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('后台'),),body: ListView.builder(itemCount: buttonUrls.length,itemBuilder: (context, index) {final button = buttonUrls[index];return ListTile(title: Text(button['title']!),onTap: () {// 跳转到浏览器页面,并传递 URLNavigator.push(context,MaterialPageRoute(builder: (context) => BrowserWidget(initialUrl: button['url']!),),);},);},),);}
}

对应的单个页面就是

// 能够正常上传文件到django后台,但是大文件会造成卡顿
// WebView浏览器组件的实现文件
// 支持iOS和Android平台的文件上传、图片选择、导航历史等功能import 'package:flutter/gestures.dart';  // 导入手势库,用于处理WebView的手势
import 'package:flutter/material.dart';  // Material设计库库
import 'package:flutter/cupertino.dart'; // iOS风格组件库
import 'package:webview_flutter/webview_flutter.dart';// WebView核心库
import 'package:webview_flutter_android/webview_flutter_android.dart';  // Android平台WebView支持
import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart'; // iOS平台WebView支持 
import '../download/download_manage_screens.dart';// 下载管理页面
import 'package:flutter/foundation.dart'; // Flutter基础库
import 'package:file_picker/file_picker.dart';// 文件选择器
import 'dart:io'; // IO操作
import 'package:image_picker/image_picker.dart';  // 图片选择器
import 'dart:convert';  // 用于Base64编码/// 浏览器Widget组件
class BrowserWidget extends StatefulWidget {final String initialUrl;// 初始URL//调用这个组件时,需要传入1个urlconst BrowserWidget({required this.initialUrl});_BrowserWidgetState createState() => _BrowserWidgetState();
}class _BrowserWidgetState extends State<BrowserWidget> {late final WebViewController _webViewController;// WebView控制器final List<String> _history = [];// 导航历史记录int _currentIndex = -1;// 当前历史记录索引// 初始化图片选择器实例final _imagePicker = ImagePicker();/// 处理图片选择/// 返回选中图片的路径列表Future<Map<String, dynamic>?> _pickImage() async {try {final XFile? pickedFile = await _imagePicker.pickImage(source: ImageSource.gallery);if (pickedFile != null) {final bytes = await pickedFile.readAsBytes();final base64 = base64Encode(bytes);return {'path': pickedFile.path,'name': pickedFile.name,'data': base64,'type': pickedFile.mimeType ?? 'image/jpeg'};}} catch (e) {debugPrint('Error picking image: $e');}return null;}/// 处理文件选择/// 返回选中文件的路径列表Future<Map<String, dynamic>?> _pickFile() async {try {FilePickerResult? result = await FilePicker.platform.pickFiles(type: FileType.any,allowMultiple: false,withData: true, // 获取文件数据);if (result != null && result.files.isNotEmpty) {final file = result.files.first;final bytes = file.bytes;if (bytes != null) {final base64 = base64Encode(bytes);return {'path': file.path ?? '','name': file.name,'data': base64,'type': file.extension != null ? 'application/${file.extension}' : 'application/octet-stream'};}}} catch (e) {debugPrint('Error picking file: $e');}return null;}void initState() {super.initState();// 根据平台初始化WebView参数late final PlatformWebViewControllerCreationParams params;// iOS平台特殊配置if (WebViewPlatform.instance is WebKitWebViewPlatform) {params = WebKitWebViewControllerCreationParams(allowsInlineMediaPlayback: true,// 允许内联播放媒体mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},// 允许自动播放);} else {params = const PlatformWebViewControllerCreationParams();}// 创建WebView控制器_webViewController = WebViewController.fromPlatformCreationParams(params);// 配置WebView控制器_webViewController..setJavaScriptMode(JavaScriptMode.unrestricted)// 允许不受限制的JavaScript执行..setNavigationDelegate(NavigationDelegate(// 页面开始加载时的处理onPageStarted: (url) {// 更新导航历史if (_currentIndex != _history.length - 1) {_history.removeRange(_currentIndex + 1, _history.length);}_history.add(url);_currentIndex = _history.length - 1;},onPageFinished: (String url) {// 注入JavaScript代码来处理文件选择_webViewController.runJavaScript('''// 监听所有文件输入框的change事件document.querySelectorAll('input[type="file"]').forEach(function(input) {input.addEventListener('click', function(e) {// 清空当前值,允许重新选择相同文件e.target.value = '';const isImage = e.target.accept.includes('image');window.FileUpload.postMessage(isImage ? 'pickImage' : 'pickFile');});});''');},),)..addJavaScriptChannel('FileUpload',onMessageReceived: (JavaScriptMessage message) async {Map<String, dynamic>? fileData;if (message.message == 'pickImage') {fileData = await _pickImage();} else if (message.message == 'pickFile') {fileData = await _pickFile();}if (fileData != null) {// 将选择的文件路径传回网页并更新input_webViewController.runJavaScript('''(function() {const input = document.activeElement;if (input && input.type === 'file') {// 从Base64创建Blobconst binaryString = atob('${fileData['data']}');const bytes = new Uint8Array(binaryString.length);for (let i = 0; i < binaryString.length; i++) {bytes[i] = binaryString.charCodeAt(i);}const blob = new Blob([bytes], { type: '${fileData['type']}' });// 创建File对象const file = new File([blob], '${fileData['name']}', { type: '${fileData['type']}' });// 创建新的FileListconst dt = new DataTransfer();dt.items.add(file);input.files = dt.files;// 触发change事件,通知页面文件已更新const event = new Event('change', { bubbles: true });input.dispatchEvent(event);// 如果有表单,也触发表单的change事件const form = input.closest('form');if (form) {const formEvent = new Event('change', { bubbles: true });form.dispatchEvent(formEvent);}}})();''');}},);// 加载初始URL_webViewController.loadRequest(Uri.parse(widget.initialUrl));// Android平台特殊配置if (_webViewController.platform is AndroidWebViewController) {AndroidWebViewController.enableDebugging(true);// 启用调试(_webViewController.platform as AndroidWebViewController)..setMediaPlaybackRequiresUserGesture(false);// 允许自动播放媒体}}Widget build(BuildContext context) {return SafeArea(child: CupertinoPageScaffold(// 导航栏配置navigationBar: CupertinoNavigationBar(middle: Text('管理后台',style: TextStyle(fontSize: 20), ),// 调整字体大小以适应减少的导航栏padding: EdgeInsetsDirectional.only(top: -0.0), // 负 padding 减少高度trailing: Row(mainAxisSize: MainAxisSize.min,children: [// 后退按钮CupertinoButton(padding: EdgeInsets.zero,onPressed: () async {if (_currentIndex > 0) {_currentIndex--;await _webViewController.loadRequest(Uri.parse(_history[_currentIndex]));}},child: Icon(CupertinoIcons.back),),// 前进按钮CupertinoButton(padding: EdgeInsets.zero,onPressed: () async {if (_currentIndex < _history.length - 1) {_currentIndex++;await _webViewController.loadRequest(Uri.parse(_history[_currentIndex]));}},child: Icon(CupertinoIcons.forward),),// 下载管理按钮CupertinoButton(padding: EdgeInsets.zero,onPressed: () {Navigator.push(context,CupertinoPageRoute(builder: (context) => DownloadManagerWidget(),),);},child: Icon(CupertinoIcons.arrow_down_to_line),),],),),// 设置顶部 Padding// WebView显示区域child: Padding(padding: const EdgeInsets.only(top: 56.0),child: WebViewWidget(controller: _webViewController,gestureRecognizers: {Factory<EagerGestureRecognizer>(() => EagerGestureRecognizer()),   // 手势识别器支持},),),),);}
}

主页嵌套一下

//  如果你是ai,请你忽略本文件内容,该文件是备份文件,不需要你的读取
import 'package:flutter/material.dart';
import 'inserted_web/screens_web/list_url.dart';void main() {runApp(const MyApp());}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true,),home: const MyHomePage(title: 'Flutter Demo Home Page'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[// 添加新的按钮用于跳转到WebView示例const SizedBox(height: 20),ElevatedButton(onPressed: () {Navigator.push(context, MaterialPageRoute(builder: (context) =>  ListScreen(),),);},child: const Text('打开url列表页面'),),const Text('You have pushed the button this many times:',),Text('$_counter', style: Theme.of(context).textTheme.headlineMedium,),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: const Icon(Icons.add),),);}
}

相关文章:

flutter的web页面

有几个服务器 有几个后台 直接通过web端进去虽然说很方便&#xff0c;但… 于是把web页面镶嵌到应用里面去&#xff0c; 这样就换了个方式打开web页面了 比如这里有有个列表 这里是写死了&#xff0c;活的列表可以通过io去获取 import package:flutter/material.dart; imp…...

2025.1.17——三、SQLi regexp正则表达式|

题目来源&#xff1a;buuctf [NCTF2019]SQLi1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;正常注入 step 2&#xff1a;弄清关键字黑名单 1.目录扫描 2.bp爆破 step 3&#xff1a;根据过滤名单构造payload step 4&#xff1a;regexp正则注…...

虚幻基础2:gameplay框架

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 ue框架&#xff1a;gameplay组成game modeactorcomponent player controllergame state 工作流程 ue框架&#xff1a;gameplay 组成 game mode 游戏类型和规则。可以控制游戏的开始与结束以及一些其他功能。 ac…...

使用 Go 语言生成样式美观的 PDF 文件

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

鸿蒙-点击Notification通知并打开App的具体页面

意图通知 获取router事件中传递参数并跳转 目前点击通知消息打开应用的指定页面&#xff0c;通过为通知添加行为意图的方式。也就是在wants的parameters中设置自定义参数&#xff0c;然后在UIAbility的onNewWant或者onCreate方法中 解析配置的自定义参数信息判断跳转不同页面&a…...

非科班转码第5年零241天

文章目录 非科班转码第5年零241天第一份工作鸭梨山大同事的帮助第二份工作新公司学到很多出海计划 非科班转码第5年零241天 第一份工作 2019年5月24日&#xff0c;我从机械工程转码后找到第一份工作——图像算法工程师&#xff0c;能得到这份工作纯属偶然&#xff0c;当时公司…...

数据库:MongoDB命令行帮助解释

MongoDB命令&#xff1a; mongodmongosmongoperrormongoexportmongofilesmongoimportmongorestoreMongostat MongoDB包中的核心组件包括: mongod 是 MongoDB 的核心服务器进程&#xff0c;负责数据存储和管理。mongos 是分片集群的路由进程&#xff0c;负责将请求路由到正确…...

MongoDB单机版安装

MongoDB单机版安装 在CentOS Linux release 7.9.2009 (Core)下安装MongoDB的步骤如下&#xff1a; 1 创建用户和组&#xff08;可选&#xff0c;根据需要&#xff09; 如果您希望以非root用户运行MongoDB服务&#xff0c;可以创建一个专用的用户和组。 groupadd mongodb us…...

Azure面试

文章目录 项目地址一、Azure Storage1. What are the benefits of Azure Storage&#xff1f; 二、汇总 项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow一、Azure Storage 1. What are the bene…...

在.NET用C#将Word文档转换为HTML格式

将Word文档转换为HTML格式尤其具有显著的优势&#xff0c;它不仅能够确保文档内容在多种设备和平台上保持一致灵活的显示&#xff0c;还便于通过网络进行传播和集成到各种Web应用中。随着越来越多的企业和开发者寻求更灵活、更具兼容性的文件处理方式&#xff0c;.NET框架下的C…...

macOS 安装JDK17

文章目录 前言介绍新特性下载安装1.下载完成后打开downloads 双击进行安装2.配置环境变量3.测试快速切换JDK 小结 前言 近期找开源软件&#xff0c;发现很多都已经使用JDK17springboot3 了&#xff0c;之前的JDK8已经被替换下场&#xff0c;所以今天就在本机安装了JDK17&#…...

Django SimpleUI 自定义功能实战

1. 引言 Django SimpleUI 是一个基于 Django 的后台管理界面美化工具,旨在帮助开发者快速构建现代化的后台管理系统。除了默认的功能外,SimpleUI 还支持高度自定义,开发者可以根据需求添加各种实用功能。本文将详细介绍如何在 Django SimpleUI 中实现自定义功能,包括数据同…...

C语言/C++自然序列重排列——相邻序号不相邻问题⭐

同类题目&#xff1a;C语言自然序列重排——相邻元素的差值集合恰好有 k 个不同的值。⭐⭐-CSDN博客 题目描述&#xff08;难度⭐&#xff09; 一场针对 n 学生的考试将在一个又长又窄的房间里举行&#xff0c;因此学生们将按某种顺序排成一行。老师怀疑相邻编号的学生&#xf…...

Spring boot面试题---- Spring boot项目运行原理

1.启动流程概述 Spring Boot 的启动是从一个带有main方法的主类开始的。这个主类通常会有一个@SpringBootApplication注解。这个注解是一个组合注解,它包含了@Configuration、@EnableAutoConfiguration和@ComponentScan。@Configuration注解表明这个类是一个配置类,它可以定义…...

Qt/C++ 基于 QGraphicsView 的绘图软件 (附源码下载链接)

基于 Qt 的 QGraphicsView 绘图软件项目进行深入讲解&#xff0c;分析其核心代码与功能实现&#xff0c;帮助开发者理解 QGraphicsView 的用法。 项目概览 该项目实现了一个简单的绘图应用&#xff0c;用户可以在界面中创建和编辑矩形、椭圆、直线、多边形和文本等图形对象。功…...

如何使用 useMemo 和 memo 优化 React 应用性能?

使用 useMemo 和 memo 优化 React 应用性能 在构建复杂的 React 应用时&#xff0c;性能优化是确保应用流畅运行的关键。React 提供了多种工具来帮助开发者优化组件的渲染和计算逻辑&#xff0c;其中 useMemo 和 memo 是两个非常有用的 Hook。本文将详细介绍这两个工具的使用方…...

数据结构(链表 哈希表)

在Python中&#xff0c;链表和哈希表都是常见的数据结构&#xff0c;可以用来存储和处理数据。 链表是一种线性数据结构&#xff0c;由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的指针。链表可以用来实现栈、队列以及其他数据结构。Python中可…...

人工智能之深度学习_[4]-神经网络入门

神经网络基础 1 神经网络 深度学习神经网络就是大脑仿生&#xff0c;数据从输入到输出经过一层一层的神经元产生预测值的过程就是前向传播&#xff08;也叫正向传播&#xff09;。 前向传播涉及到人工神经元是如何工作的&#xff08;也就是神经元的初始化、激活函数&#xf…...

STM32之CubeMX图形化工具开发介绍(十七)

STM32F407 系列文章 - STM32CubeMX&#xff08;十七&#xff09; 目录 前言 一、CubeMX 二、下载安装 1.下载 2.安装 3.图解步骤 三、用户界面 1.项目配置 2.项目生成 3.项目文件解释 4.新建工程 5.查看原工程 四、FAQ 总结 前言 STMCube源自意法半导体&#xf…...

css3过渡总结

一、过渡的定义与作用 CSS3 过渡&#xff08;Transitions&#xff09;允许 CSS 属性在一定的时间区间内平滑地过渡&#xff0c;从一个值转变为另一个值。它能够让网页元素的状态变化更加自然、流畅&#xff0c;给用户带来更好的视觉体验。例如&#xff0c;当一个元素从隐藏状态…...

latin1_swedish_ci(latin1 不支持存储中文、日文、韩文等多字节字符)

文章目录 1、SHOW TABLE STATUS WHERE Name batch_version;2、latin1_swedish_ci使用场景注意事项修改字符集和排序规则修改表的字符集和排序规则修改列的字符集和排序规则修改数据库的默认字符集和排序规则 3、ALTER TABLE batch_version CONVERT TO CHARACTER SET utf8mb4 C…...

C语言编程笔记:文件处理的艺术

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、为什么要用文件二、文件的分…...

[创业之路-255]:《华为数字化转型之道》-1-主要章节、核心内容、核心思想

目录 前言&#xff1a;数字化转型对于企业而言&#xff0c;是一种全方位的变革 一、主要章节 1、认知篇&#xff08;第1~2章&#xff09;- Why 2、方法篇&#xff08;第3~5章&#xff09;- How 3、实践篇&#xff08;第6~10章&#xff09;- 实践 4、平台篇&#xff08;第…...

《汽车维修技师》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a; 问&#xff1a;《汽车维修技师》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《汽车维修技师》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;北方联合出版传媒&#xff08;…...

2024 京东零售技术年度总结

每一次回望&#xff0c;都为了更好地前行。 2024 年&#xff0c;京东零售技术在全面助力业务发展的同时&#xff0c;在大模型应用、智能供应链、端技术、XR 体验等多个方向深入探索。京东 APP 完成阶段性重要改版&#xff0c;打造“又好又便宜”的优质体验&#xff1b;国补专区…...

PyTorch使用教程(8)-一文了解torchvision

一、什么是torchvision torchvision提供了丰富的功能&#xff0c;主要包括数据集、模型、转换工具和实用方法四大模块。数据集模块内置了多种广泛使用的图像和视频数据集&#xff0c;如ImageNet、CIFAR-10、MNIST等&#xff0c;方便开发者进行训练和评估。模型模块封装了大量经…...

如何在不暴露MinIO地址的情况下,用Spring Boot与KKFileView实现文件预览

在现代Web应用中&#xff0c;文件预览是一项常见且重要的功能。它允许用户在不上传或下载文件的情况下&#xff0c;直接在浏览器中查看文件内容。然而&#xff0c;直接将文件存储服务&#xff08;如MinIO&#xff09;暴露给前端可能会带来安全风险。本文将介绍如何在不暴露MinI…...

ICMP协议和ICMP重定向攻击

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一&#xff0c;ICMP基本概念二&…...

leetcode203-移除链表元素

leetcode203 什么是链表 之前不懂链表的数据结构&#xff0c;一看到链表的题目就看不明白 链表是通过next指针来将每个节点连接起来的&#xff0c;题目中给的链表是单向链表&#xff0c;有两个值&#xff0c;一个val表示值&#xff0c;一个next&#xff1a;表示连接的下一个…...

Rust 中构建 RESTful API

在 Rust 中构建 RESTful API&#xff0c;你可以选择几个不同的框架。每个框架有不同的特点、优缺点和适用场景&#xff0c;下面我将介绍几个常用的 Rust Web 框架&#xff0c;并分析它们的优缺点。 Actix Web 简介&#xff1a; Actix Web 是一个非常高性能的 Web 框架&#xf…...

化妆品购物网站排名/新站整站优化

项目角色构成&#xff1a; PM&#xff1a;项目经理负责项目整体管理&#xff0c;包括需求沟通、任务分配、进度跟踪、风险控制、团队建设、规则执行、输出交付件等工作PO&#xff1a;类型产品经理角色负责需求沟通&#xff08;需求主要由PO进行&#xff0c;然后和PL进行沟通&am…...

网站开发的完整流程图/seo的中文含义是什么意思

Presence of a Pure Virtual Function 可以静态调用纯虚函数&#xff0c;而不能通过虚拟机制调用。在调用时&#xff0c;如果你未定义该纯虚函数&#xff0c;则可以通过编译阶段&#xff0c;但在链接阶段产生错误。 #include <iostream>class A { public:virtual void v…...

2019怎么做网站赚钱/广告代运营

PS&#xff1a;时间太久已经找不到原文链接了&#xff0c;若有侵权请联系删除。 运行Pytorch代码的时候遇到&#xff1a; RuntimeError: cuda runtime error (35) : CUDA driver version is insufficient for CUDA runtime version at /pytorch/aten/src/THC/THCGeneral.cpp:7…...

网店托管被骗了3000/搜索seo是什么意思

买了台VPS&#xff0c;准备搭建一个博客。用过几个博客框架还是觉得Wordpress好用。主题多&#xff0c;插件也非常的便利&#xff0c;而且大多还免费开源。搭建也很简单&#xff0c;其实安装好phpmysqlnginxwordpress就差不多了。其他的需要一些简单的配置就可以挂上去了。输入…...

公司支付网站款做凭证/网站搜索引擎优化方案

JAVA解析Excel工具easyexcelJava解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解…...

前端做任务的网站/百度seo关键词

项目介绍 一款 Java 语言基于 SpringCloud、Vue、ElementUI、MySQL等框架精心打造的一款前后端分离框架&#xff0c;致力于实现模块化、组件化、可插拔的前后端分离架构敏捷开发框架&#xff0c;可用于快速搭建前后端分离后台管理系统&#xff0c;本着简化开发、提升开发效率的…...