RuoYi-Vue3代码生成工具:从数据库表到前端页面的自动化方案
引言:你还在手动编写CRUD代码吗?
作为开发者,你是否曾陷入重复编写CRUD(创建、读取、更新、删除)代码的困境?面对数十个数据库表,每个表都需要编写对应的实体类、数据访问层、服务层、控制器以及前端页面,这种机械劳动不仅耗费大量时间,还容易引入人为错误。根据统计,一个中型项目中约40%的代码属于重复性CRUD逻辑,而开发这些代码占用了开发者30%以上的工作时间。
RuoYi-Vue3作为一款基于SpringBoot、Spring Security、JWT、Vue3 & Vite、Element Plus的前后端分离权限管理系统,提供了强大的代码生成工具,能够从数据库表结构自动生成完整的前后端代码。本文将详细介绍如何利用这一工具实现从数据库表到前端页面的全流程自动化,帮助你节省80%的CRUD代码编写时间,专注于核心业务逻辑的开发。
读完本文,你将能够:
- 理解RuoYi-Vue3代码生成工具的工作原理
- 掌握从数据库表导入到代码生成的完整流程
- 自定义代码生成规则以满足特定项目需求
- 解决代码生成过程中常见的问题和挑战
RuoYi-Vue3代码生成工具概述
工具定位与优势
RuoYi-Vue3代码生成工具(Code Generator)是一个可视化的代码生成平台,旨在通过自动化手段减少重复性编码工作。它基于数据库表结构,按照预设模板生成标准的前后端代码,支持多种生成方式和自定义配置。
核心优势:
| 优势 | 描述 |
|---|---|
| 全栈代码生成 | 一次性生成从数据库表到前端页面的完整代码,包括实体类、Mapper、Service、Controller和Vue组件 |
| 可视化配置 | 通过直观的界面配置生成规则,无需编写复杂脚本 |
| 模板自定义 | 支持修改代码模板,适应不同项目的编码规范和架构要求 |
| 权限集成 | 生成的代码自动集成系统的权限控制机制 |
| 批量操作 | 支持多表同时导入和批量生成代码 |
技术架构
代码生成工具的技术架构如下:
flowchart TD
A[数据库表] -->|导入| B[代码生成工具]
B --> C{配置生成规则}
C --> D[生成后端代码]
C --> E[生成前端代码]
D --> F[Java实体类]
D --> G[Mapper接口与XML]
D --> H[Service层]
D --> I[Controller层]
E --> J[Vue页面组件]
E --> K[API请求文件]
E --> L[路由配置]
F --> M[项目集成]
G --> M
H --> M
I --> M
J --> M
K --> M
L --> M
从架构图可以看出,代码生成工具作为中间层,连接数据库表和项目代码,通过配置规则将数据库结构转换为可直接使用的业务代码。
快速上手:10分钟完成代码生成
环境准备
在使用代码生成工具前,请确保你的开发环境满足以下要求:
- JDK 1.8+
- MySQL 5.7+
- Node.js 14+
- Vue CLI 4+
- RuoYi-Vue3项目已成功运行
完整流程演示
以下是使用RuoYi-Vue3代码生成工具的完整步骤:
步骤1:准备数据库表
首先,在数据库中创建一个示例表,用于演示代码生成过程。以"用户反馈"表为例:
CREATE TABLE `sys_feedback` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`content` varchar(500) NOT NULL COMMENT '反馈内容',
`contact` varchar(100) DEFAULT NULL COMMENT '联系方式',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(0:待处理,1:已处理,2:已关闭)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户反馈表';
步骤2:导入数据库表
- 登录RuoYi-Vue3系统,进入"系统工具" -> "代码生成"页面
- 点击"导入"按钮,打开导入表弹窗
- 在弹窗中选择数据库连接,系统会列出所有可用表
- 勾选"sys_feedback"表,点击"确定"完成导入
步骤3:配置生成信息
- 在代码生成列表中找到刚导入的"sys_feedback"表,点击"修改"按钮
- 在基本信息页配置表的基本信息:
- 生成模块:system
- 生成业务名:feedback
- 生成功能名:用户反馈
- 生成作者:yourname
- 在字段信息页配置每个字段的生成规则:
- 设置字段的Java类型、备注、是否在列表/查询/新增/编辑中显示等
- 对于"status"字段,设置为字典类型,关联"sys_feedback_status"字典
- 点击"保存"按钮保存配置
步骤4:生成代码
- 返回代码生成列表,勾选"sys_feedback"表
- 点击"生成"按钮,系统会自动生成代码并打包为ZIP文件
- 下载并解压ZIP文件,得到以下目录结构:
ruoyi-ui/
└── src/
├── api/
│ └── system/
│ └── feedback.js
├── views/
│ └── system/
│ └── feedback/
│ └── index.vue
ruoyi-system/
└── src/
└── main/
├── java/
│ └── com/
│ └── ruoyi/
│ └── system/
│ ├── controller/
│ │ └── SysFeedbackController.java
│ ├── domain/
│ │ └── SysFeedback.java
│ ├── mapper/
│ │ └── SysFeedbackMapper.java
│ └── service/
│ ├── ISysFeedbackService.java
│ └── impl/
│ └── SysFeedbackServiceImpl.java
└── resources/
└── mapper/
└── system/
└── SysFeedbackMapper.xml
步骤5:集成到项目中
将生成的代码复制到对应项目目录:
- 后端代码复制到
ruoyi-system模块 - 前端代码复制到
ruoyi-ui模块 - 执行数据库脚本,添加菜单和权限配置
- 重新启动前后端项目
步骤6:访问生成的功能
- 刷新系统菜单,在"系统管理"下会出现"用户反馈"菜单
- 点击菜单进入用户反馈管理页面,可以看到自动生成的CRUD界面
- 测试新增、查询、编辑、删除等功能
深入理解:代码生成工具核心功能
表管理
表管理是代码生成工具的基础功能,负责维护可生成代码的数据库表列表。
表列表功能
代码生成工具的首页是表列表页面,展示所有已导入的数据库表信息。页面主要包含以下元素:
<template>
<div class="app-container">
<!-- 搜索栏 -->
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="表名称" prop="tableName">
<el-input
v-model="queryParams.tableName"
placeholder="请输入表名称"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="表描述" prop="tableComment">
<el-input
v-model="queryParams.tableComment"
placeholder="请输入表描述"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="创建时间" style="width: 308px">
<el-date-picker
v-model="dateRange"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Download"
:disabled="multiple"
@click="handleGenTable"
v-hasPermi="['tool:gen:code']"
>生成</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="openCreateTable"
v-hasRole="['admin']"
>创建</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="Upload"
@click="openImportTable"
v-hasPermi="['tool:gen:import']"
>导入</el-button>
</el-col>
<!-- 更多按钮 -->
</el-row>
<!-- 表列表 -->
<el-table ref="genRef" v-loading="loading" :data="tableList" @selection-change="handleSelectionChange">
<el-table-column type="selection" align="center" width="55"></el-table-column>
<el-table-column label="序号" type="index" width="50" align="center"></el-table-column>
<el-table-column label="表名称" align="center" prop="tableName" :show-overflow-tooltip="true" />
<el-table-column label="表描述" align="center" prop="tableComment" :show-overflow-tooltip="true" />
<el-table-column label="实体" align="center" prop="className" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="160" sortable="custom" />
<el-table-column label="更新时间" align="center" prop="updateTime" width="160" sortable="custom" />
<el-table-column label="操作" align="center" width="330">
<!-- 操作按钮 -->
</el-table-column>
</el-table>
<!-- 分页控件 -->
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>
列表页面提供了表的基本信息展示、搜索、分页和批量操作功能,是代码生成的入口。
表操作功能
每个表支持以下操作:
- 预览:查看生成的代码内容,确认无误后再下载
- 编辑:修改表的生成配置,如模块名、功能名等
- 删除:从代码生成列表中移除表
- 同步:同步数据库表结构的最新变化
- 生成代码:生成并下载该表对应的前后端代码
代码生成流程详解
代码生成工具的核心功能是将数据库表结构转换为可执行代码,这一过程主要通过以下步骤实现:
-
元数据解析:工具首先从数据库中获取表和字段的元数据信息,包括表名、字段名、数据类型、长度、约束等。
-
代码模板渲染:基于解析得到的元数据,使用Velocity模板引擎渲染预设的代码模板。核心代码如下:
// 预览代码功能
function handlePreview(row) {
previewTable(row.tableId).then(response => {
preview.value.data = response.data;
preview.value.open = true;
preview.value.activeName = "domain.java";
});
}
// 生成代码功能
function handleGenTable(row) {
const tbNames = row.tableName || tableNames.value;
if (tbNames == "") {
proxy.$modal.msgError("请选择要生成的数据");
return;
}
if (row.genType === "1") {
genCode(row.tableName).then(response => {
proxy.$modal.msgSuccess("成功生成到自定义路径:" + row.genPath);
});
} else {
proxy.$download.zip("/tool/gen/batchGenCode?tables=" + tbNames, "ruoyi.zip");
}
}
- 代码打包下载:生成的代码文件按照模块结构组织,并打包为ZIP文件供用户下载。
生成代码结构解析
生成的代码遵循RuoYi-Vue3的项目结构,分为后端和前端两部分:
后端代码结构
ruoyi-system/
└── src/main/java/com/ruoyi/system/
├── controller/ # 控制器层,处理HTTP请求
├── domain/ # 实体类,映射数据库表
├── mapper/ # 数据访问层,操作数据库
└── service/ # 业务逻辑层
└── impl/ # 业务逻辑实现
以SysFeedbackController.java为例,生成的控制器包含了标准的CRUD接口:
/**
* 用户反馈Controller
*
* @author yourname
* @date 2023-07-01
*/
@RestController
@RequestMapping("/system/feedback")
public class SysFeedbackController extends BaseController
{
@Autowired
private ISysFeedbackService sysFeedbackService;
/**
* 查询用户反馈列表
*/
@PreAuthorize("@ss.hasPermi('system:feedback:list')")
@GetMapping("/list")
public TableDataInfo list(SysFeedback sysFeedback)
{
startPage();
List<SysFeedback> list = sysFeedbackService.selectSysFeedbackList(sysFeedback);
return getDataTable(list);
}
/**
* 获取用户反馈详细信息
*/
@PreAuthorize("@ss.hasPermi('system:feedback:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(sysFeedbackService.selectSysFeedbackById(id));
}
/**
* 新增用户反馈
*/
@PreAuthorize("@ss.hasPermi('system:feedback:add')")
@Log(title = "用户反馈", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysFeedback sysFeedback)
{
return toAjax(sysFeedbackService.insertSysFeedback(sysFeedback));
}
/**
* 修改用户反馈
*/
@PreAuthorize("@ss.hasPermi('system:feedback:edit')")
@Log(title = "用户反馈", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysFeedback sysFeedback)
{
return toAjax(sysFeedbackService.updateSysFeedback(sysFeedback));
}
/**
* 删除用户反馈
*/
@PreAuthorize("@ss.hasPermi('system:feedback:remove')")
@Log(title = "用户反馈", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(sysFeedbackService.deleteSysFeedbackByIds(ids));
}
}
前端代码结构
ruoyi-ui/src/
├── api/ # API请求接口定义
└── views/ # 页面组件
└── system/ # 系统模块
└── feedback/ # 功能模块
└── index.vue # 列表页面
生成的前端页面组件index.vue包含了完整的CRUD界面:
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
v-hasPermi="['system:feedback:add']"
>新增</el-button>
</el-col>
<!-- 更多操作按钮 -->
</el-row>
<!-- 搜索表单 -->
<el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
<!-- 搜索字段 -->
</el-form>
<!-- 列表表格 -->
<el-table
v-loading="loading"
:data="feedbackList"
@selection-change="handleSelectionChange"
>
<!-- 表格列定义 -->
</el-table>
<!-- 分页控件 -->
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 新增/编辑弹窗 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<!-- 表单字段 -->
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listFeedback, getFeedback, delFeedback, addFeedback, updateFeedback } from "@/api/system/feedback";
export default {
name: "Feedback",
data() {
return {
// 页面数据和方法定义
};
},
methods: {
// 页面方法实现
}
};
</script>
高级应用:自定义代码生成规则
模板自定义
RuoYi-Vue3代码生成工具使用Velocity模板引擎,允许用户通过修改模板来自定义生成的代码风格。模板文件位于项目的resources/templates目录下。
自定义实体类模板示例:
原始模板(domain.java.vm):
package ${packageName}.${moduleName}.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* ${tableComment}实体类
*
* @author ${author}
* @date ${createTime}
*/
@Data
@TableName("${tableName}")
public class ${className} implements Serializable
{
private static final long serialVersionUID = 1L;
#foreach ($column in $columns)
#if($column.isPk)
/**
* ${column.comment}
*/
@TableId(type = IdType.AUTO)
private ${column.javaType} ${column.javaFieldName};
#else
/**
* ${column.comment}
*/
private ${column.javaType} ${column.javaFieldName};
#end
#end
}
修改后的模板,增加 Lombok 的 @NoArgsConstructor 和 @AllArgsConstructor 注解:
package ${packageName}.${moduleName}.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
/**
* ${tableComment}实体类
*
* @author ${author}
* @date ${createTime}
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("${tableName}")
public class ${className} implements Serializable
{
private static final long serialVersionUID = 1L;
#foreach ($column in $columns)
#if($column.isPk)
/**
* ${column.comment}
*/
@TableId(type = IdType.AUTO)
private ${column.javaType} ${column.javaFieldName};
#else
/**
* ${column.comment}
*/
private ${column.javaType} ${column.javaFieldName};
#end
#end
}
修改后的模板生成的实体类将包含更多 Lombok 注解,简化代码编写。
生成配置详解
代码生成工具提供了丰富的配置选项,允许用户自定义生成的代码:
- 基本信息配置:
| 配置项 | 说明 |
|---|---|
| 生成模块 | 代码所属的业务模块,如system、tool等 |
| 生成业务名 | 业务模块下的子模块名 |
| 生成功能名 | 功能名称,用于页面标题等 |
| 生成作者 | 作者名,用于注释 |
| 生成包路径 | 后端代码的基础包路径 |
| 前端路径 | 前端代码的存放路径 |
- 字段信息配置:
每个字段可以单独配置以下属性:
| 配置项 | 说明 |
|---|---|
| 字段名称 | 数据库字段名 |
| 字段类型 | 数据库字段类型 |
| Java类型 | 对应的Java数据类型 |
| Java字段名 | 生成的Java字段名 |
| 备注 | 字段说明 |
| 是否主键 | 是否为主键 |
| 是否自增 | 是否自增 |
| 是否必填 | 是否为必填字段 |
| 查询方式 | 如等于、不等于、模糊等 |
| 显示类型 | 如文本框、下拉框、日期选择器等 |
| 字典类型 | 如果是下拉框,对应的字典类型 |
通过合理配置这些选项,可以生成符合项目需求的代码,减少手动修改的工作量。
常见问题与解决方案
数据库表导入失败
问题描述:点击"导入"按钮后,无法看到数据库表或导入失败。
可能原因及解决方案:
- 数据库连接配置错误:检查
application-druid.yml中的数据库连接配置是否正确。
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ruoyi-vue3?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: password
-
数据库用户权限不足:确保数据库用户具有
information_schema库的查询权限,以便工具能够获取表结构信息。 -
表名或字段名包含特殊字符:避免使用数据库关键字作为表名或字段名,如
order、user等。
生成的代码缺少某些功能
问题描述:生成的代码中缺少某些预期功能,如高级查询、数据导出等。
解决方案:
-
检查代码生成配置中的"查询方式"是否正确设置,确保需要的查询条件已勾选。
-
确认是否勾选了"生成导出功能"选项,该选项控制是否生成数据导出代码。
-
如果需要自定义功能,可以修改代码模板,添加相应的代码片段。
代码风格不符合项目规范
问题描述:生成的代码风格与项目现有的编码规范不一致。
解决方案:
-
修改代码生成模板,调整代码格式、命名规范等。
-
使用代码格式化工具(如IDE的格式化功能)统一代码风格。
-
编写自定义的代码生成后处理器,对生成的代码进行二次处理。
性能优化:大规模项目中的代码生成策略
批量生成与增量生成
对于包含大量表的项目,建议采用以下策略提高代码生成效率:
- 批量生成:选择多个表同时生成代码,减少重复操作。
// 批量生成代码的核心逻辑
function handleGenTable(row) {
const tbNames = row.tableName || tableNames.value;
if (tbNames == "") {
proxy.$modal.msgError("请选择要生成的数据");
return;
}
// 调用批量生成接口
proxy.$download.zip("/tool/gen/batchGenCode?tables=" + tbNames, "ruoyi.zip");
}
-
增量生成:只对新增或修改的表进行代码生成,避免重复生成已有代码。
-
分模块生成:按照业务模块分批生成代码,便于代码审查和集成。
模板缓存与预编译
对于频繁使用代码生成功能的团队,可以通过模板缓存和预编译提高生成速度:
-
将常用的模板组合预编译为模板组,减少每次生成时的模板加载时间。
-
缓存解析后的数据库元数据,避免重复查询数据库。
-
使用本地文件系统缓存生成的代码,避免重复生成相同的代码。
总结与展望
RuoYi-Vue3代码生成工具通过自动化手段,极大地减少了开发者编写重复性CRUD代码的工作量,提高了开发效率和代码质量。本文详细介绍了该工具的使用方法、核心功能和高级应用技巧,希望能帮助开发者更好地利用这一工具。
随着低代码开发平台的兴起,代码生成工具也在不断演进。未来,RuoYi-Vue3代码生成工具可能会在以下方面进一步优化:
-
AI辅助配置:通过AI技术自动推荐代码生成配置,减少手动配置的工作量。
-
更丰富的模板库:提供更多领域的代码模板,如报表、工作流等。
-
可视化模板编辑:通过拖拽等可视化方式编辑代码模板,降低模板定制门槛。
-
与CI/CD集成:将代码生成集成到持续集成/持续部署流程,实现全自动化开发流程。
通过不断优化和完善代码生成工具,RuoYi-Vue3将为开发者提供更高效、更便捷的开发体验,让开发者能够将更多精力投入到核心业务逻辑的创新中。
附录:常用配置参考
数据库类型与Java类型映射关系
| 数据库类型 | Java类型 | 说明 |
|---|---|---|
| VARCHAR | String | 字符串 |
| INT | Integer | 整数 |
| BIGINT | Long | 长整数 |
| DECIMAL | BigDecimal | 高精度小数 |
| DATETIME | Date | 日期时间 |
| TIMESTAMP | Date | 时间戳 |
| TINYINT | Integer | 小整数 |
| BIT | Boolean | 布尔值 |
常用查询方式
| 查询方式 | 说明 |
|---|---|
| EQ | 等于 |
| NE | 不等于 |
| LIKE | 模糊查询 |
| LEFT_LIKE | 左模糊查询 |
| RIGHT_LIKE | 右模糊查询 |
| GT | 大于 |
| GE | 大于等于 |
| LT | 小于 |
| LE | 小于等于 |
| BETWEEN | 区间查询 |
| IN | 包含查询 |
常用显示类型
| 显示类型 | 说明 |
|---|---|
| input | 文本输入框 |
| select | 下拉选择框 |
| radio | 单选框 |
| checkbox | 复选框 |
| datetime | 日期时间选择器 |
| date | 日期选择器 |
| time | 时间选择器 |
| textarea | 文本域 |
| switch | 开关 |
| upload | 文件上传 |
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00