ApiHug 前端解决方案 - M1 内侧


背景

ApiHug UI 解决方案 - ApiHug前后端语义化设计,节约80%以上时间https://apihug.github.io/zhCN-docs/ui

现代前端框架日趋SPA(Single Page Application)化,给前后协同都带来了挑战,ApiHug试图减少多人在前后协同带来的理解难度,和同步的滞后性。 所以采用了:

  1. 前后项目在同工程中不同子模块
  2. 工具链上融合, gradle + vite, 无缝集成,互相可以调用任务
  3. 运行时,java application 静态代理 + vue 端 proxy

以实现前后端人员协同最大化,上下文切换最低化,开发效率最大化!

这中新开发方式不是 ApiHug 首创,很早如Jhipster 已在尝试,当然 ApiHug 也从 Jhipster上获取了很多灵感;

ApiHug 紧紧围绕 Open Api 标准,使用DSL作为不同角色之间通用语言,让这一步推进异常的顺利!

下面我们从协议层, 到应用层, 再到UI 层一一带你一步步领略如何借助 ApiHug 快速而又优雅进行全栈开发!

协议

协议,也就是 ProtoBuffer DSL, 这次没有任何修改,依然是以前的 Proto DSL

前端完整模版尚未正式发布,还在内侧中。

​Structure

├─assets (1)
│  ├─styles
│  │  └─transition
│  └─svg-icon
├─components (2)
│  ├─dashboard
│  └─ui
│      ├─accordion
│      ├─alert
├─composables (3)
├─config  (4)
├─directive (5)
├─layouts (6)
│  └─admin
├─lib (7)
├─locales  (8)
│  └─langs
│      ├─en-US
│      └─zh-CN
├─pages (9)
│  ├─dashboard
│  └─example
├─router (10)
│  └─auto
├─service (11)
│  ├─api
│  ├─form
│  ├─model
│  └─table
├─stores (12)
├─types  (13)
└─utils (14)
DirectoryContent
(1)CSS 风格
(2)组件库
(3)Hook
(4)配置
(5)指令扩展
(6)布局
(7)三方类
(8)国际化
(9)页面
(10)路由
(11)服务
(12)状态
(13)d.ts定义
(14)帮助类

​功能

​Vite

  1. Auto-import
  2. Auto-component
  3. Icon

​Component

​Layout

​Router

​Authority

​Style

  1. Theme
  2. Color
  3. Tailwindcss

​Catalog

​Plugin

​packages

​Trivial

  1. lint
  2. prettier
  3. vscode
  4. format/antfu

​Tip

  1. 生成文件可以在文件备注 // hope-no-merger 禁止生成覆盖,⚠️无法升级更新

配置

角色定义:

  1. proto 定义标准
  2. app 定义应用
  3. ui 定义交互

源泉均来自 proto生成的协议,然后具由此生成应用基础,应用再链接 ui; 所以一般流程:

  1. 编译 proto 生成协议
  2. 通过协议 stub 生成 应用
  3. 生成应用过程中选择是否生成 ui

UI 的生成规则,需要配置给 app, app触发UI生成;

打开 vue 生成标志, {app}/build.gradle:

hopeStub {enableFrontVue = true
}

{app}/ui.json:

{"projectDir": "../good-app-ui"
}
PropertyComment
projectDirUI 模块相对路径
httpVendor@/service/http, useGet/Post Module
noMergerfalse 预留,未用
outputDirsrc/service, API输出UI模块内相对目录
alwaysEraseOldfalse 预留,未用
formTypeRequestItem form 类型
formModule../type form 类型引用路径
columnTypeResponseItem column 类型
columnModule../type column 类型引用路径
pathToUrlimport { pathToUrl } from '@/service/utils' path 路径解析帮助函数
langDirsrc/locales/langs 国际化输出UI模块内相对目录
firstLanguagezh-CN 国际化,第一语言
secondLanguageen-US 国际化,第二语言
typessrc/types 类型输出UI模块相对目录

​编译

普通执行 stub 命令即可生成 UI 内容:

./gradlew.bat {app}:clean stub build -x test -x stubTest

  1. 国际化
  2. Api Stub
  3. Api Model
  4. form/table Stub
  5. type
  6. 其他
├─assets
│....
├─locales
│  │  
│  └─langs
│      ├─en-US
│      │      app.json
│      │
│      └─zh-CN
│              app.json
├─service
│  │  http.ts
│  │  index.ts
│  │  type.ts
│  │  utils.ts
│  │
│  ├─api
│  │      api-example-api.ts
│  │      api-system-system.ts
│  │      index.ts
│  │
│  ├─form
│  │      TemplateExampleRequest.ts
│  │      UploadBookCoverToLocalRequest.ts
│  │
│  ├─model
│  │      api-example-request-example.ts
│  │      api-example-response-example.ts
│  │      index.ts
│  │
│  └─table
│          TemplateExampleResponse.ts
├─types
│      api.d.ts
│      app.d.ts
│      auth.d.ts

​运行

由于现代的框架都是SPA(Single Page Application)架构,给前后协同都带来了挑战,ApiHug试图减少多人在前后协同带来的理解难度,和同步的滞后性。 所以采用了:

  1. 前后项目在同工程中不同子模块
  2. 工具链上融合, gradle + vite, 无缝集成,互相可以调用任务
  3. 运行时,java application 静态代理 + vue 端 proxy

以实现前后端人员协同最大化,上下文切换最低化,开发效率最大化!

​App Build Hook

打包资源依赖 UI 项目打包,同时copy UI 资源 dist 到运行时静态文件目录:

    //Really Static resource of the UI to Output Dirtasks.register('copyUIResources', Copy) {dependsOn project(':good-app-ui').tasks.named('build')from project(':good-app-ui').layout.projectDirectory.dir('dist')into "${layout.buildDirectory.get()}/resources/main/static"}tasks.named('processResources') {dependsOn 'copyUIResources'}

​SPA Filter

打开 hope.open.api.enable 标志; 将 api 之外目录反向到 index.html 入口:

SpaPathChecker DEFAULT =path ->!path.startsWith("/api")&& !path.startsWith("/management")&& !path.startsWith("/v3/api-docs")&& !path.startsWith("/hope/meta")&& !path.startsWith("/h2-console")&& !path.contains(".")&& path.matches("/(.*)");if (checker.passToSpa(path)) {request.getRequestDispatcher("/index.html").forward(request, response);return;
}

然后就可以尽情享受和前端一样丝滑的便捷和体验!

​Refer

  1. Jhipster
  2. jmix
  3. vaadin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】DeepSeek 与 RAG 技术:构建知识增强型问答系统的实战

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 本文深入探讨了如何利用 DeepSeek R1 模型结合检索增强生成(RAG)技术,构建一个高效的知识增强型问答系统。RAG 技术通过结合信息检索与生…

强大的AI网站推荐(第五集)—— Suno

网站:Suno 号称:被许多用户称为“最强音乐类AI” 博主评价:早在去年1月,我就已经开始使用过了,从小就有一个音乐梦,奈何五音不全,现在用这个来进行创作音乐,有想AI创造音乐的可以试试…

Sigma-Delta ADC(ΣΔ-ADC)中的量化器简介

Sigma-Delta ADC(ΣΔ-ADC)是一种高精度的模数转换器,其中的量化器是其核心组件之一。量化器负责将模拟信号转换为数字信号,并通过独特的噪声整形技术实现高分辨率。接下来,我们将深入了解量化器的各个方面&#xff1a…

Oracle日志系统之附加日志

Oracle日志系统之附加日志 在 Oracle 数据库中,附加日志(Supplemental Log)是一种增强日志记录的机制,用于在数据库的 redo log 中记录更多的变更信息,尤其是在进行数据迁移、复制和同步等任务时,能够确保…

使用源码编译安装golang的docker版

编译规则 1.4之前用C写的&#xff0c;1.4可编译后续一直到1.9版本&#xff0c;后续版本实现了自举&#xff0c;后续版本是go写的&#xff0c;基本上相互低2个版本能编译出新版本。 Go < 1.4&#xff1a;C 工具链。 1.5 < Go < 1.19&#xff1a;Go 1.4 编译器。 1.20…

Android平台 Hal AIDL 系列文章目录

目录 1. Android Hal AIDL 简介2. AIDL 语言简介3. Android 接口定义语言 (AIDL)4. 定义AIDL 接口5. AIDL 中如何传递 Parcelable 对象6. 如何使用AIDL 定义的远程接口进行跨进程通信7. 适用于 HAL 的 AIDL8. Android Hal AIDL 编译调试9. 高版本Android (AIDL HAL) 沿用HIDL方…

【失败】Gnome将默认终端设置为 Kitty

起因 一会儿gnome-terminal一会儿kitty终端&#xff0c;实在是受不了&#xff0c;决定取缔默认的gnome-terminal。 过程 在 Ubuntu 或 Debian 系统上&#xff1a; 确保 Kitty 已经安装。如果未安装&#xff0c;可以在终端中运行命令sudo apt install kitty -y进行安装。 使用系…

Linux工具学习之【gcc/g++】

&#x1f4d8;前言 书接上文&#xff0c;我们已经学习了 Linux 中的编辑器 vim 的相关使用方法&#xff0c;现在已经能直接在 Linux 中编写C/C代码&#xff0c;有了代码之后就要尝试去编译并运行它&#xff0c;此时就可以学习一下 Linux 中的编译器 gcc/g 了&#xff0c;我们一…

微信小程序文字混合、填充动画有效果图

效果图 .wxml <view class"text" style"--deg:{{deg}}deg;"><view>混合父级颜色</view> </view> <view class"fill {{status?action:}}">文字颜色填充</view> <button bind:tap"setStatus"…

C++:PTA L1-006 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3567&#xff0c;其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N&#xff0c;要求编写程序求出最长连续因子的个数&#xff0c;并输出最小的连续因子序列。 输入格式&#xff1a; 输入在一行中给出一…

分享:批量提取图片文字并自动命名文件,ocr识别图片指定区域并重命名文件名工具,基于WPF和腾讯OCR识别的接口的视线方案

一、项目背景 在处理大量图片时,常常需要从图片中提取特定区域的文字信息,并依据这些信息对图片进行重命名。例如,在档案管理领域,大量纸质文件被扫描成图片后,需要从图片中提取关键信息(如文件编号、日期等)来重命名图片,以便后续的检索和管理;在电商领域,商家可能…

汇编语言中的数据

在汇编语言中&#xff0c;程序都是由指令流构成的&#xff0c;而指令一般是由操作符和操作数组成的&#xff0c;操作符是CPU用来完成某项功能的操作&#xff0c;而操作数是操作符所处理加工的对象。比如&#xff1a;add eax, 42&#xff0c;add是执行一个加法运算的操作符&…

C++17 信号量模拟实现

C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有)&#xff0c;但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑&#xff1a; #include <mutex> #include <condition_variable>class CountingSemaphore { private:…

C++ 网络层接口设计与实现:基于 Socket 编程

在网络编程中&#xff0c;网络层是 OSI 七层模型中负责将数据从源节点传输到目的节点的关键层次。在 C 中&#xff0c;网络层的功能通常通过 Socket 编程接口来实现。Socket 提供了一种抽象机制&#xff0c;允许应用程序通过网络发送和接收数据。本文将详细介绍如何在 C 中使用…

uniapp中uni-easyinput 使用@input 不改变绑定的值

只允许输入数字和字母 使用input 正则replace后赋值给A 遇到问题: 当输入任意连续的非法字符时, 输入框不变. 直到输入一个合法字符非法字符才成功被过滤. <uni-forms-item label"纳税人识别号" name"number"><uni-easyinput v-model"numb…

Docker安装hoppscotch

Docker安装hoppscotch 1 简介 1.1 Hoppscotch‌系统 ‌Hoppscotch‌是一个轻量、高效的[API开发生态系统&#xff0c;开源于2020年&#xff0c;原名Postwoman&#xff0c;后更名为Hoppscotch。它基于Node.js构建&#xff0c;支持多种HTTP请求方法&#xff0c;包括GET、POST、…

1.Axum 与 Tokio:异步编程的完美结合

摘要 深入解析 Axum 核心架构与 Tokio 异步运行时的集成&#xff0c;掌握关键原理与实践技巧。 一、引言 在当今的软件开发领域&#xff0c;高并发和高性能是衡量一个系统优劣的重要指标。对于 Web 服务器而言&#xff0c;能够高效地处理大量并发请求是至关重要的。Rust 语言…

CSS伪元素

伪元素 伪元素 用于在元素的内容前后或特定部分插入虚拟元素&#xff0c;并为其添加样式&#xff0c;无需修改 HTML 结构。 语法&#xff1a;使用双冒号 ::&#xff08;现代规范&#xff09; 以下是一些常见的CSS伪元素的示例&#xff1a; 1.::before &#xff1a; 在元素内…

easyexcel使用模板填充excel坑点总结

1.单层map设置值是{属性}&#xff0c;那使用两层map进行设置值&#xff0c;是不是可以使用{属性.属性}&#xff0c;以为取出map里字段只用{属性}就可以设置值&#xff0c;那再加个.就可以从里边map取出对应属性&#xff0c;没有两层map写法 填充得到的文件打开报错 was empty (…

在Ubuntu服务器上部署xinference

一、拉取镜像 docker pull xprobe/xinference:latest二、启动容器&#xff08;GPU&#xff09; docker run -d --name xinference -e XINFERENCE_MODEL_SRCmodelscope -p 9997:9997 --gpus all xprobe/xinference:latest xinference-local -H 0.0.0.0 # 启动一个新的Docker容…