diff --git a/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.html b/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.html
new file mode 100644
index 00000000..21456f95
--- /dev/null
+++ b/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.html
@@ -0,0 +1,3 @@
+
+
+
diff --git a/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.scss b/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.scss
new file mode 100644
index 00000000..f9945434
--- /dev/null
+++ b/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.scss
@@ -0,0 +1,7 @@
+.ledge-sunburst {
+ width: auto;
+ height: auto;
+ min-width: 500px;
+ min-height: 500px;
+ max-width: 800px;
+}
diff --git a/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.spec.ts b/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.spec.ts
new file mode 100644
index 00000000..119928b6
--- /dev/null
+++ b/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LedgeSunburstComponent } from './ledge-sunburst.component';
+
+describe('LedgeSunburstComponent', () => {
+ let component: LedgeSunburstComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ LedgeSunburstComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(LedgeSunburstComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.ts b/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.ts
new file mode 100644
index 00000000..47c5c15e
--- /dev/null
+++ b/projects/ledge-render/src/lib/chart/ledge-sunburst/ledge-sunburst.component.ts
@@ -0,0 +1,72 @@
+import { AfterViewInit, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
+import * as echarts from 'echarts';
+import { LedgeList, LedgeListItem } from '../../components/model/ledge-chart.model';
+
+
+@Component({
+ selector: 'ledge-sunburst',
+ templateUrl: './ledge-sunburst.component.html',
+ styleUrls: ['./ledge-sunburst.component.scss']
+})
+export class LedgeSunburstComponent implements OnInit, AfterViewInit {
+ @Input()
+ data: LedgeListItem[];
+
+ @Input()
+ config: any;
+
+ @ViewChild('chart', {}) chart: ElementRef;
+
+ private childLevel = 1;
+
+ ngOnInit(): void {
+ }
+
+ ngAfterViewInit(): void {
+ const myChart = echarts.init(this.chart.nativeElement);
+ const result = this.setValue(this.data, 0);
+ console.log(result);
+ const option = this.buildOption(this.data);
+ console.log(this.data);
+ myChart.setOption(option as any);
+ }
+
+ private buildOption(treeData: any) {
+ return {
+ visualMap: {
+ type: 'continuous',
+ min: 0,
+ max: 10,
+ inRange: {
+ color: ['#2D5F73', '#538EA6', '#F2D1B3', '#F2B8A2', '#F28C8C']
+ }
+ },
+ series: {
+ type: 'sunburst',
+ data: treeData,
+ radius: [0, '90%'],
+ label: {
+ rotate: 'radial'
+ }
+ }
+ };
+ }
+
+ private setValue(list: LedgeListItem[], value) {
+ for (const item of list) {
+ value++;
+ if (item.children) {
+ this.setValue(item.children, value);
+ item.value = value;
+ item.itemStyle = {
+ color: '#FFB499'
+ };
+ } else {
+ item.value = 1;
+ value = 0;
+ }
+ }
+
+ return list;
+ }
+}
diff --git a/projects/ledge-render/src/lib/components/model/ledge-chart.model.ts b/projects/ledge-render/src/lib/components/model/ledge-chart.model.ts
index 38368792..99ffc26b 100644
--- a/projects/ledge-render/src/lib/components/model/ledge-chart.model.ts
+++ b/projects/ledge-render/src/lib/components/model/ledge-chart.model.ts
@@ -23,6 +23,9 @@ export interface LedgeListItem {
children?: LedgeListItem[];
name?: string;
checked?: boolean;
+
+ value?: number;
+ itemStyle?: any;
}
export interface LedgeList {
diff --git a/projects/ledge-render/src/lib/ledge-render.component.html b/projects/ledge-render/src/lib/ledge-render.component.html
index cf607eb5..ed6bccc6 100644
--- a/projects/ledge-render/src/lib/ledge-render.component.html
+++ b/projects/ledge-render/src/lib/ledge-render.component.html
@@ -66,6 +66,10 @@
+
+
+
+
diff --git a/projects/ledge-render/src/lib/ledge-render.component.ts b/projects/ledge-render/src/lib/ledge-render.component.ts
index 0d13da7f..d4bc22b8 100644
--- a/projects/ledge-render/src/lib/ledge-render.component.ts
+++ b/projects/ledge-render/src/lib/ledge-render.component.ts
@@ -355,6 +355,14 @@ export class LedgeRenderComponent implements OnInit, OnChanges {
config: checklistData.config,
});
break;
+ case 'sunburst':
+ const sunburstData = LedgeMarkdownConverter.toJson(codeBlock.text);
+ this.markdownData.push({
+ type: 'sunburst',
+ data: sunburstData.lists[0].children,
+ config: sunburstData.config,
+ });
+ break;
case 'mermaid':
const mermaidData = codeBlock.text;
this.markdownData.push({
diff --git a/projects/ledge-render/src/lib/ledge-render.module.ts b/projects/ledge-render/src/lib/ledge-render.module.ts
index 09e75e6a..3edee69a 100644
--- a/projects/ledge-render/src/lib/ledge-render.module.ts
+++ b/projects/ledge-render/src/lib/ledge-render.module.ts
@@ -25,6 +25,7 @@ import { LedgeStorageService } from './services/ledge-storage.service';
import { LedgeChecklistComponent } from './components/ledge-checklist/ledge-checklist.component';
import { LedgeMermaidComponent } from './components/ledge-mermaid/ledge-mermaid.component';
import { TohtmlPipe } from './pipes/tohtml.pipe';
+import { LedgeSunburstComponent } from './chart/ledge-sunburst/ledge-sunburst.component';
const LedgeComponents = [
LedgeRenderComponent,
@@ -45,6 +46,7 @@ const LedgeComponents = [
LedgeKanbanComponent,
LedgeChecklistComponent,
LedgeMermaidComponent,
+ LedgeSunburstComponent,
ComponentTodoComponent,
ComponentChecklistComponent,
diff --git a/src/assets/docs/pattern.md b/src/assets/docs/pattern.md
index 762ef087..16947311 100644
--- a/src/assets/docs/pattern.md
+++ b/src/assets/docs/pattern.md
@@ -187,112 +187,115 @@ ThoughtWorks Tech Lead 模型
### DevSecOps 示例
-- 需求
- - Wekan
- - Gitlab
- - Ganttlab
-- 开发(后端)
- - Swagger
- - knife4j
- - Spring Cloud Alibaba
- - Skaffolder CLI
-- 开发(前端)
- - Swagger
- - Pont
- - Jest.js
-- IDE
- - Idea
- - Sonarlint
-- 版本控制
- - truffleHog \*
- - Git Toolkit
- - Gitlab
- - git-secrets \*
-- 持续集成
- - Jenkins
- - Blue Ocean
- - Health Advisor
- - Prometheus
- - Docker
- - Git
- - Pipeline
-- 构建
- - Dockerfile
- - hadolint \*
-- 分析
- - SAST \*
- - Sonarqube
- - Snyk
- - FOSSology
- - CodeQL CLI
- - Compliance \*
- - SCA \*
- - Ort
- - Dependency-Check
- - Dependency-Track
-- 制品
- - 供应链安全 \*
- - ClearlyDefined
- - OpenChain
- - 容器 \*
- - Anchore
- - Trivy
- - Clair
- - 优化
- - Docker Slim
- - 源
- - Nexus
- - Artifactory
- - Archiva
-- 部署
- - Ansible
- - Nomad
- - Docker Compose
- - Make
- - Werf
- - Tekton
- - Screwdriver
-- 环境
- - OS
- - Zsh
- - Docker
- - Kubernetes
- - Rancher
- - OpenShift/OKD
- - KubeOperator
- - hardening & compliance \*
- - kube-hunter
- - Falco
- - Lynis
- - diagnosis
- - Sysdig Inspect
- - Arthus reaction
- - monitoring
- - Prometheus/Grafana
- - Influxdb
- - apm & tracing
- - Skywalking
- - logging
- - ELK
- - Loki
-- 集成测试
- - Fuzzing \*
- - 自动化测试
- - Dredd
- - Newman + Postman
- - Http Runner 基于录制
- - Cucumber
- - galasa-dev
- - Pact
- - DAST \*
- - Zed
- - Openvas Nvt
- - Contrast Security
- - Vulscan
- - Nessus
- - Vuls.io
-- 可见性
- - Hygieia
+```sunburst
+ - DevSecOps 示例
+ - 需求
+ - Wekan
+ - Gitlab
+ - Ganttlab
+ - 开发(后端)
+ - Swagger
+ - knife4j
+ - Spring Cloud Alibaba
+ - Skaffolder CLI
+ - 开发(前端)
+ - Swagger
+ - Pont
+ - Jest.js
+ - IDE
+ - Idea
+ - Sonarlint
+ - 版本控制
+ - truffleHog \*
+ - Git Toolkit
+ - Gitlab
+ - git-secrets \*
+ - 持续集成
+ - Jenkins
+ - Blue Ocean
+ - Health Advisor
+ - Prometheus
+ - Docker
+ - Git
+ - Pipeline
+ - 构建
+ - Dockerfile
+ - hadolint \*
+ - 分析
+ - SAST \*
+ - Sonarqube
+ - Snyk
+ - FOSSology
+ - CodeQL CLI
+ - Compliance \*
+ - SCA \*
+ - Ort
+ - Dependency-Check
+ - Dependency-Track
+ - 制品
+ - 供应链安全 \*
+ - ClearlyDefined
+ - OpenChain
+ - 容器 \*
+ - Anchore
+ - Trivy
+ - Clair
+ - 优化
+ - Docker Slim
+ - 源
+ - Nexus
+ - Artifactory
+ - Archiva
+ - 部署
+ - Ansible
+ - Nomad
+ - Docker Compose
+ - Make
+ - Werf
+ - Tekton
+ - Screwdriver
+ - 环境
+ - OS
+ - Zsh
+ - Docker
+ - Kubernetes
+ - Rancher
+ - OpenShift/OKD
+ - KubeOperator
+ - hardening & compliance \*
+ - kube-hunter
+ - Falco
+ - Lynis
+ - diagnosis
+ - Sysdig Inspect
+ - Arthus reaction
+ - monitoring
+ - Prometheus/Grafana
+ - Influxdb
+ - apm & tracing
+ - Skywalking
+ - logging
+ - ELK
+ - Loki
+ - 集成测试
+ - Fuzzing \*
+ - 自动化测试
+ - Dredd
+ - Newman + Postman
+ - Http Runner 基于录制
+ - Cucumber
+ - galasa-dev
+ - Pact
+ - DAST \*
+ - Zed
+ - Openvas Nvt
+ - Contrast Security
+ - Vulscan
+ - Nessus
+ - Vuls.io
+ - 可见性
+ - Hygieia
+```
## BizDevOps