Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
067e173
feat: 图表支持折线图与面积图
qianmoQ Jun 6, 2026
f94ba2d
feat: 图表支持饼图/环形图
qianmoQ Jun 6, 2026
452abd5
feat: 图表支持散点图
qianmoQ Jun 6, 2026
cc73230
feat: 图表支持雷达图
qianmoQ Jun 6, 2026
e732d5a
feat: 图表支持漏斗图
qianmoQ Jun 7, 2026
839ddca
feat: 图表支持热力图
qianmoQ Jun 7, 2026
570dee7
feat: 图表支持仪表盘
qianmoQ Jun 7, 2026
7d761d2
docs: README 补充 SQL 图表可视化与数据源能力
qianmoQ Jun 7, 2026
cd8dad2
refactor: 图表配置面板改为表驱动
qianmoQ Jun 7, 2026
a0ecf77
feat: 图表支持桑基图
qianmoQ Jun 7, 2026
c88becf
fix: 桑基图节点分隔符改用可见的 :: 前缀
qianmoQ Jun 7, 2026
f416575
feat: 图表支持旭日图
qianmoQ Jun 7, 2026
ac03c4e
feat: 图表支持矩形树图
qianmoQ Jun 7, 2026
0578bbf
feat: 图表支持树图
qianmoQ Jun 7, 2026
7d5daee
feat: 图表支持箱线图
qianmoQ Jun 7, 2026
07091d6
feat: 图表支持 K 线图
qianmoQ Jun 7, 2026
e85d909
feat: 图表支持平行坐标
qianmoQ Jun 7, 2026
a45e4b8
feat: 图表支持主题河流
qianmoQ Jun 7, 2026
2b7b61f
feat: 图表支持日历热力图
qianmoQ Jun 7, 2026
393f7e0
docs: README 图表清单更新为 18 种
qianmoQ Jun 7, 2026
92949dd
feat: 图表支持导出 PNG
qianmoQ Jun 7, 2026
9b41560
feat: 图表支持玫瑰图(南丁格尔)
qianmoQ Jun 7, 2026
f26dd88
feat: 图表支持涟漪散点图
qianmoQ Jun 7, 2026
0efe74c
feat: 图表支持关系图(网络)
qianmoQ Jun 7, 2026
9435cc9
feat: 图表支持极坐标柱状图
qianmoQ Jun 7, 2026
c9539cb
docs: README 图表清单更新为 22 种(补充玫瑰/涟漪散点/关系图/极坐标柱状, 注明可导出 PNG)
qianmoQ Jun 7, 2026
bb4bb42
feat: 图表支持象形柱图
qianmoQ Jun 7, 2026
bb02e3e
feat: 图表支持词云与水球图
qianmoQ Jun 7, 2026
e7ebd3c
feat: 图表支持中国地图与世界地图
qianmoQ Jun 7, 2026
b4bbfc8
chore: 提交地图 GeoJSON 数据并放开其 gitignore 例外
qianmoQ Jun 7, 2026
6be836f
docs: README 图表清单更新为 27 种(补充象形柱/词云/水球/中国地图/世界地图)
qianmoQ Jun 7, 2026
3232967
feat: 图表配置持久化
qianmoQ Jun 7, 2026
e5ddd79
feat: 新增 CSV 语言插件,输出数据表/图表视图
qianmoQ Jun 7, 2026
278297b
feat: 新增 TSV 语言插件
qianmoQ Jun 7, 2026
c693ff7
docs: README 与图标补充 CSV/TSV
qianmoQ Jun 7, 2026
2b78ad5
feat: 图表新增复制图片与导出数据 CSV
qianmoQ Jun 7, 2026
3f1e54e
feat: SQL 结果表与 CSV 数据表支持导出 CSV
qianmoQ Jun 7, 2026
ab1d829
feat: 图表支持导出 SVG,导出操作收纳为下拉菜单
qianmoQ Jun 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ pnpm-lock.yaml
*.csv
*.json
!config*.json
!src/components/charts/geo/*.json
go.mod
.RData
.Rhistory
Expand Down
16 changes: 10 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@

### 📊 结构化数据可视化
- **JSON / XML / YAML** —— 可折叠**层级树**,以及卡片 + 连线的**关系图**两种可视化
- **SQL** —— 基于 rusqlite 执行(无需外部 sqlite3),结果渲染为**表格**;可连接内存库或指定 `.sqlite` 文件,失败显示具体错误
- **SQL** —— 插件式执行器(内存库 / `.sqlite` 文件 / **MySQL**,可在设置中配置连接、运行时选择数据源),结果渲染为**表格**,失败显示具体错误;执行历史与实时运行一致
- **图表可视化** —— SQL 结果一键切换为图表:**拖拽**字段到「维度 / 指标」即可成图,自动识别数值列,支持聚合(求和/计数/平均/最大/最小)、排序、Top N。基于 ECharts,内置 **27 种**图表:柱状图 · 折线图 · 面积图 · 饼图/环形图 · 玫瑰图 · 散点图 · 涟漪散点图 · 雷达图 · 漏斗图 · 热力图 · 仪表盘 · 桑基图 · 关系图 · 旭日图 · 矩形树图 · 树图 · 箱线图 · K 线图 · 平行坐标 · 主题河流 · 日历热力图 · 极坐标柱状图 · 象形柱图 · 词云 · 水球图 · 中国地图 · 世界地图(配色跟随主题,支持导出 PNG)。配置面板表驱动,组件与数据源解耦,后续 CSV 等本地数据可复用
- **CSV / TSV** —— 解析为**数据表**(支持引号转义、字段内换行、自动识别分隔符),并可一键切换为上述 27 种图表(与 SQL 共用图表面板)
- **Markdown** —— 实时渲染预览(支持内嵌 HTML,DOMPurify 净化防 XSS)
- **GitHub Actions 工作流** —— 自动识别并渲染为 **Jobs 依赖 DAG 图**(触发事件 → 各 Job → Steps)

Expand All @@ -71,7 +73,7 @@

## 🧩 支持的语言

可运行语言均采用**插件化架构**,每种语言独立实现;JSON / XML / YAML / Markdown / 纯文本为编辑与可视化类型。
可运行语言均采用**插件化架构**,每种语言独立实现;JSON / XML / YAML / Markdown / CSV / TSV / 纯文本为编辑与可视化类型。

<div align="center">
<img src="public/icons/python.svg" width="48" title="Python 2 / 3" />
Expand Down Expand Up @@ -108,12 +110,14 @@
<img src="public/icons/xml.svg" width="48" title="XML" />
<img src="public/icons/yaml.svg" width="48" title="YAML" />
<img src="public/icons/markdown.svg" width="48" title="Markdown" />
<img src="public/icons/csv.svg" width="48" title="CSV" />
<img src="public/icons/tsv.svg" width="48" title="TSV" />
<img src="public/icons/text.svg" width="48" title="纯文本" />
</div>

<div align="center">

`Python` · `Node.js` · `TypeScript` · `JavaScript` · `Go` · `Rust` · `Java` · `Kotlin` · `Scala` · `Groovy` · `Clojure` · `C` · `C++` · `Objective-C/C++` · `Swift` · `Ruby` · `PHP` · `R` · `Lua` · `Haskell` · `Cangjie` · `Shell` · `AppleScript` · `SQL` · `HTML` · `CSS` · `SVG` · `JSON` · `XML` · `YAML` · `Markdown` · `Text`
`Python` · `Node.js` · `TypeScript` · `JavaScript` · `Go` · `Rust` · `Java` · `Kotlin` · `Scala` · `Groovy` · `Clojure` · `C` · `C++` · `Objective-C/C++` · `Swift` · `Ruby` · `PHP` · `R` · `Lua` · `Haskell` · `Cangjie` · `Shell` · `AppleScript` · `SQL` · `HTML` · `CSS` · `SVG` · `JSON` · `XML` · `YAML` · `Markdown` · `CSV` · `TSV` · `Text`

</div>

Expand Down Expand Up @@ -144,10 +148,10 @@ pnpm tauri build

| 层 | 技术 |
| --- | --- |
| 前端 | Vue 3 · TypeScript · Tailwind CSS · CodeMirror 6 |
| 后端 | Rust · Tauri 2 |
| 前端 | Vue 3 · TypeScript · Tailwind CSS · CodeMirror 6 · ECharts |
| 后端 | Rust · Tauri 2(rusqlite · mysql) |
| 存储 | SQLite(执行历史 / AI 对话 / 代码片段 / 应用配置统一入库) |
| 架构 | 插件化语言支持系统 |
| 架构 | 插件化语言支持系统 · 插件式数据库执行器 · 可复用图表组件 |

---

Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
"codemirror": "^6.0.2",
"dompurify": "^3.4.8",
"echarts": "^6.1.0",
"echarts-liquidfill": "^3.1.0",
"echarts-wordcloud": "^2.1.0",
"js-yaml": "^4.2.0",
"lodash-es": "^4.17.21",
"lucide-vue-next": "^0.539.0",
Expand Down
8 changes: 8 additions & 0 deletions public/icons/csv.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions public/icons/tsv.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
55 changes: 55 additions & 0 deletions src-tauri/src/plugins/csv.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
use super::{LanguagePlugin, PluginConfig};
use std::vec;

pub struct CsvPlugin;

impl LanguagePlugin for CsvPlugin {
fn get_order(&self) -> i32 {
40
}

fn get_language_name(&self) -> &'static str {
"CSV"
}

fn get_language_key(&self) -> &'static str {
"csv"
}

fn get_file_extension(&self) -> String {
self.get_config()
.map(|config| config.extension.clone())
.unwrap_or_else(|| "csv".to_string())
}

fn get_version_args(&self) -> Vec<&'static str> {
vec!["--"]
}

fn get_path_command(&self) -> String {
"--".to_string()
}

fn get_default_config(&self) -> PluginConfig {
PluginConfig {
enabled: true,
language: String::from("csv"),
before_compile: None,
extension: String::from("csv"),
execute_home: None,
// 输出原始 CSV 内容,由前端「数据表/图表」视图解析渲染
run_command: Some(String::from("cat $filename")),
after_compile: None,
template: Some(String::from("name,value\nA,1\nB,2\nC,3")),
timeout: Some(30),
console_type: Some(String::from("table")),
icon_path: None,
}
}

fn get_default_command(&self) -> String {
self.get_config()
.and_then(|config| config.run_command.clone())
.unwrap_or_else(|| "cat".to_string())
}
}
4 changes: 4 additions & 0 deletions src-tauri/src/plugins/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use crate::plugins::cangjie::CangjiePlugin;
use crate::plugins::clojure::ClojurePlugin;
use crate::plugins::cpp::CppPlugin;
use crate::plugins::css::CssPlugin;
use crate::plugins::csv::CsvPlugin;
use crate::plugins::custom::CustomPlugin;
use crate::plugins::go::GoPlugin;
use crate::plugins::groovy::GroovyPlugin;
Expand Down Expand Up @@ -33,6 +34,7 @@ use crate::plugins::sql::SqlPlugin;
use crate::plugins::svg::SvgPlugin;
use crate::plugins::swift::SwiftPlugin;
use crate::plugins::text::TextPlugin;
use crate::plugins::tsv::TsvPlugin;
use crate::plugins::typescript::TypeScriptPlugin;
use crate::plugins::typescript_browser::TypeScriptBrowserPlugin;
use crate::plugins::typescript_nodejs::TypeScriptNodeJsPlugin;
Expand Down Expand Up @@ -76,6 +78,8 @@ impl PluginManager {
("yaml".to_string(), Box::new(YamlPlugin)),
("markdown".to_string(), Box::new(MarkdownPlugin)),
("text".to_string(), Box::new(TextPlugin)),
("csv".to_string(), Box::new(CsvPlugin)),
("tsv".to_string(), Box::new(TsvPlugin)),
("sql".to_string(), Box::new(SqlPlugin)),
("php".to_string(), Box::new(PHPPlugin)),
("r".to_string(), Box::new(RPlugin)),
Expand Down
2 changes: 2 additions & 0 deletions src-tauri/src/plugins/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,7 @@ pub mod cangjie;
pub mod clojure;
pub mod cpp;
pub mod css;
pub mod csv;
pub mod custom;
pub mod go;
pub mod groovy;
Expand Down Expand Up @@ -433,6 +434,7 @@ pub mod sql;
pub mod svg;
pub mod swift;
pub mod text;
pub mod tsv;
pub mod typescript;
pub mod typescript_browser;
pub mod typescript_nodejs;
Expand Down
55 changes: 55 additions & 0 deletions src-tauri/src/plugins/tsv.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
use super::{LanguagePlugin, PluginConfig};
use std::vec;

pub struct TsvPlugin;

impl LanguagePlugin for TsvPlugin {
fn get_order(&self) -> i32 {
41
}

fn get_language_name(&self) -> &'static str {
"TSV"
}

fn get_language_key(&self) -> &'static str {
"tsv"
}

fn get_file_extension(&self) -> String {
self.get_config()
.map(|config| config.extension.clone())
.unwrap_or_else(|| "tsv".to_string())
}

fn get_version_args(&self) -> Vec<&'static str> {
vec!["--"]
}

fn get_path_command(&self) -> String {
"--".to_string()
}

fn get_default_config(&self) -> PluginConfig {
PluginConfig {
enabled: true,
language: String::from("tsv"),
before_compile: None,
extension: String::from("tsv"),
execute_home: None,
// 输出原始 TSV 内容,由前端「数据表/图表」视图解析渲染(自动识别制表符分隔)
run_command: Some(String::from("cat $filename")),
after_compile: None,
template: Some(String::from("name\tvalue\nA\t1\nB\t2\nC\t3")),
timeout: Some(30),
console_type: Some(String::from("table")),
icon_path: None,
}
}

fn get_default_command(&self) -> String {
self.get_config()
.and_then(|config| config.run_command.clone())
.unwrap_or_else(|| "cat".to_string())
}
}
9 changes: 9 additions & 0 deletions src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,14 @@
:is-running="isRunning"
:execution-time="lastExecutionTime"
@clear="clearOutput"/>

<!-- 数据表 / 图表(CSV / TSV) -->
<DataTableView v-else-if="consoleType === 'table'"
class="flex-1"
:output="output"
:is-running="isRunning"
:execution-time="lastExecutionTime"
@clear="clearOutput"/>
</div>
</template>
</ResizablePanels>
Expand Down Expand Up @@ -358,6 +366,7 @@ import MarkdownView from "./components/MarkdownView.vue";
import XmlView from "./components/XmlView.vue";
import YamlView from "./components/YamlView.vue";
import SqlTableView from "./components/SqlTableView.vue";
import DataTableView from "./components/DataTableView.vue";
import SqlSourceSelect from "./components/SqlSourceSelect.vue";
import StatusBar from './components/StatusBar.vue'
import About from './components/About.vue'
Expand Down
Loading
Loading