data_process_ui/app/doc/开发指南.html
2026-01-12 09:21:42 +08:00

540 lines
70 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<link rel="stylesheet" href="a.css">
<link rel="stylesheet" href="b.css">
<head><style>.ͼ1.cm-focused {outline: 1px dotted #212121;}
.ͼ1 {position: relative !important; box-sizing: border-box; display: flex !important; flex-direction: column;}
.ͼ1 .cm-scroller {display: flex !important; align-items: flex-start !important; font-family: monospace; line-height: 1.4; height: 100%; overflow-x: auto; position: relative; z-index: 0; overflow-anchor: none;}
.ͼ1 .cm-content[contenteditable=true] {-webkit-user-modify: read-write-plaintext-only;}
.ͼ1 .cm-content {margin: 0; flex-grow: 2; flex-shrink: 0; display: block; white-space: pre; word-wrap: normal; box-sizing: border-box; min-height: 100%; padding: 4px 0; outline: none;}
.ͼ1 .cm-lineWrapping {white-space: pre-wrap; white-space: break-spaces; word-break: break-word; overflow-wrap: anywhere; flex-shrink: 1;}
.ͼ2 .cm-content {caret-color: black;}
.ͼ3 .cm-content {caret-color: white;}
.ͼ1 .cm-line {display: block; padding: 0 2px 0 6px;}
.ͼ1 .cm-layer > * {position: absolute;}
.ͼ1 .cm-layer {position: absolute; left: 0; top: 0; contain: size style;}
.ͼ2 .cm-selectionBackground {background: #d9d9d9;}
.ͼ3 .cm-selectionBackground {background: #222;}
.ͼ2.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground {background: #d7d4f0;}
.ͼ3.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground {background: #233;}
.ͼ1 .cm-cursorLayer {pointer-events: none;}
.ͼ1.cm-focused > .cm-scroller > .cm-cursorLayer {animation: steps(1) cm-blink 1.2s infinite;}
@keyframes cm-blink {50% {opacity: 0;}}
@keyframes cm-blink2 {50% {opacity: 0;}}
.ͼ1 .cm-cursor, .ͼ1 .cm-dropCursor {border-left: 1.2px solid black; margin-left: -0.6px; pointer-events: none;}
.ͼ1 .cm-cursor {display: none;}
.ͼ3 .cm-cursor {border-left-color: #ddd;}
.ͼ1 .cm-dropCursor {position: absolute;}
.ͼ1.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor {display: block;}
.ͼ1 .cm-iso {unicode-bidi: isolate;}
.ͼ1 .cm-announced {position: fixed; top: -10000px;}
@media print {.ͼ1 .cm-announced {display: none;}}
.ͼ2 .cm-activeLine {background-color: #cceeff44;}
.ͼ3 .cm-activeLine {background-color: #99eeff33;}
.ͼ2 .cm-specialChar {color: red;}
.ͼ3 .cm-specialChar {color: #f78;}
.ͼ1 .cm-gutters {flex-shrink: 0; display: flex; height: 100%; box-sizing: border-box; inset-inline-start: 0; z-index: 200;}
.ͼ2 .cm-gutters {background-color: #f5f5f5; color: #6c6c6c; border-right: 1px solid #ddd;}
.ͼ3 .cm-gutters {background-color: #333338; color: #ccc;}
.ͼ1 .cm-gutter {display: flex !important; flex-direction: column; flex-shrink: 0; box-sizing: border-box; min-height: 100%; overflow: hidden;}
.ͼ1 .cm-gutterElement {box-sizing: border-box;}
.ͼ1 .cm-lineNumbers .cm-gutterElement {padding: 0 3px 0 5px; min-width: 20px; text-align: right; white-space: nowrap;}
.ͼ2 .cm-activeLineGutter {background-color: #e2f2ff;}
.ͼ3 .cm-activeLineGutter {background-color: #222227;}
.ͼ1 .cm-panels {box-sizing: border-box; position: sticky; left: 0; right: 0; z-index: 300;}
.ͼ2 .cm-panels {background-color: #f5f5f5; color: black;}
.ͼ2 .cm-panels-top {border-bottom: 1px solid #ddd;}
.ͼ2 .cm-panels-bottom {border-top: 1px solid #ddd;}
.ͼ3 .cm-panels {background-color: #333338; color: white;}
.ͼ1 .cm-tab {display: inline-block; overflow: hidden; vertical-align: bottom;}
.ͼ1 .cm-widgetBuffer {vertical-align: text-top; height: 1em; width: 0; display: inline;}
.ͼ1 .cm-placeholder {color: #888; display: inline-block; vertical-align: top;}
.ͼ1 .cm-highlightSpace {background-image: radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%); background-position: center;}
.ͼ1 .cm-highlightTab {background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="20"><path stroke="%23888" stroke-width="1" fill="none" d="M1 10H196L190 5M190 15L196 10M197 4L197 16"/></svg>'); background-size: auto 100%; background-position: right 90%; background-repeat: no-repeat;}
.ͼ1 .cm-trailingSpace {background-color: #ff332255;}
.ͼ1 .cm-button {vertical-align: middle; color: inherit; font-size: 70%; padding: .2em 1em; border-radius: 1px;}
.ͼ2 .cm-button:active {background-image: linear-gradient(#b4b4b4, #d0d3d6);}
.ͼ2 .cm-button {background-image: linear-gradient(#eff1f5, #d9d9df); border: 1px solid #888;}
.ͼ3 .cm-button:active {background-image: linear-gradient(#111, #333);}
.ͼ3 .cm-button {background-image: linear-gradient(#393939, #111); border: 1px solid #888;}
.ͼ1 .cm-textfield {vertical-align: middle; color: inherit; font-size: 70%; border: 1px solid silver; padding: .2em .5em;}
.ͼ2 .cm-textfield {background-color: white;}
.ͼ3 .cm-textfield {border: 1px solid #555; background-color: inherit;}
.ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul > li, .ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul > completion-section {padding: 1px 3px; line-height: 1.2;}
.ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul > li {overflow-x: hidden; text-overflow: ellipsis; cursor: pointer;}
.ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul > completion-section {display: list-item; border-bottom: 1px solid silver; padding-left: 0.5em; opacity: 0.7;}
.ͼ1 .cm-tooltip.cm-tooltip-autocomplete > ul {font-family: monospace; white-space: nowrap; overflow: hidden auto; max-width: 700px; max-width: min(700px, 95vw); min-width: 250px; max-height: 10em; height: 100%; list-style: none; margin: 0; padding: 0;}
.ͼ2 .cm-tooltip-autocomplete ul li[aria-selected] {background: #17c; color: white;}
.ͼ2 .cm-tooltip-autocomplete-disabled ul li[aria-selected] {background: #777;}
.ͼ3 .cm-tooltip-autocomplete ul li[aria-selected] {background: #347; color: white;}
.ͼ3 .cm-tooltip-autocomplete-disabled ul li[aria-selected] {background: #444;}
.ͼ1 .cm-completionListIncompleteTop:before, .ͼ1 .cm-completionListIncompleteBottom:after {content: "···"; opacity: 0.5; display: block; text-align: center;}
.ͼ1 .cm-tooltip.cm-completionInfo {position: absolute; padding: 3px 9px; width: max-content; max-width: 400px; box-sizing: border-box; white-space: pre-line;}
.ͼ1 .cm-completionInfo.cm-completionInfo-left {right: 100%;}
.ͼ1 .cm-completionInfo.cm-completionInfo-right {left: 100%;}
.ͼ1 .cm-completionInfo.cm-completionInfo-left-narrow {right: 30px;}
.ͼ1 .cm-completionInfo.cm-completionInfo-right-narrow {left: 30px;}
.ͼ2 .cm-snippetField {background-color: #00000022;}
.ͼ3 .cm-snippetField {background-color: #ffffff22;}
.ͼ1 .cm-snippetFieldPosition {vertical-align: text-top; width: 0; height: 1.15em; display: inline-block; margin: 0 -0.7px -.7em; border-left: 1.4px dotted #888;}
.ͼ1 .cm-completionMatchedText {text-decoration: underline;}
.ͼ1 .cm-completionDetail {margin-left: 0.5em; font-style: italic;}
.ͼ1 .cm-completionIcon {font-size: 90%; width: .8em; display: inline-block; text-align: center; padding-right: .6em; opacity: 0.6; box-sizing: content-box;}
.ͼ1 .cm-completionIcon-function:after, .ͼ1 .cm-completionIcon-method:after {content: 'ƒ';}
.ͼ1 .cm-completionIcon-class:after {content: '○';}
.ͼ1 .cm-completionIcon-interface:after {content: '◌';}
.ͼ1 .cm-completionIcon-variable:after {content: '𝑥';}
.ͼ1 .cm-completionIcon-constant:after {content: '𝐶';}
.ͼ1 .cm-completionIcon-type:after {content: '𝑡';}
.ͼ1 .cm-completionIcon-enum:after {content: '';}
.ͼ1 .cm-completionIcon-property:after {content: '□';}
.ͼ1 .cm-completionIcon-keyword:after {content: '🔑︎';}
.ͼ1 .cm-completionIcon-namespace:after {content: '▢';}
.ͼ1 .cm-completionIcon-text:after {content: 'abc'; font-size: 50%; vertical-align: middle;}
.ͼ1 .cm-tooltip {z-index: 500; box-sizing: border-box;}
.ͼ2 .cm-tooltip {border: 1px solid #bbb; background-color: #f5f5f5;}
.ͼ2 .cm-tooltip-section:not(:first-child) {border-top: 1px solid #bbb;}
.ͼ3 .cm-tooltip {background-color: #333338; color: white;}
.ͼ1 .cm-tooltip-arrow:before, .ͼ1 .cm-tooltip-arrow:after {content: ''; position: absolute; width: 0; height: 0; border-left: 7px solid transparent; border-right: 7px solid transparent;}
.ͼ1 .cm-tooltip-above .cm-tooltip-arrow:before {border-top: 7px solid #bbb;}
.ͼ1 .cm-tooltip-above .cm-tooltip-arrow:after {border-top: 7px solid #f5f5f5; bottom: 1px;}
.ͼ1 .cm-tooltip-above .cm-tooltip-arrow {bottom: -7px;}
.ͼ1 .cm-tooltip-below .cm-tooltip-arrow:before {border-bottom: 7px solid #bbb;}
.ͼ1 .cm-tooltip-below .cm-tooltip-arrow:after {border-bottom: 7px solid #f5f5f5; top: 1px;}
.ͼ1 .cm-tooltip-below .cm-tooltip-arrow {top: -7px;}
.ͼ1 .cm-tooltip-arrow {height: 7px; width: 14px; position: absolute; z-index: -1; overflow: hidden;}
.ͼ3 .cm-tooltip .cm-tooltip-arrow:before {border-top-color: #333338; border-bottom-color: #333338;}
.ͼ3 .cm-tooltip .cm-tooltip-arrow:after {border-top-color: transparent; border-bottom-color: transparent;}
.ͼn {color: #c678dd;}
.ͼo {color: var(--md-color);}
.ͼp {color: #2d8cf0;}
.ͼq {color: #d19a66;}
.ͼr {color: #3f4a54;}
.ͼs {color: #e5c07b;}
.ͼt {color: #56b6c2;}
.ͼu {color: #2d8cf0;}
.ͼv {font-weight: bold;}
.ͼw {font-style: italic;}
.ͼx {text-decoration: line-through;}
.ͼy {color: #2d8cf0; text-decoration: underline;}
.ͼz {font-weight: bold; color: var(--md-color);}
.ͼ10 {color: #d19a66;}
.ͼ11 {color: #3f4a54;}
.ͼ12 {color: #fff;}
.ͼm {color: #3f4a54; background-color: var(--md-bk-color);}
.ͼm .cm-content {caret-color: #3f4a54;}
.ͼm .cm-cursor, .ͼm .cm-dropCursor {border-left-color: #3f4a54;}
.ͼm.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .ͼm .cm-selectionBackground, .ͼm .cm-content ::selection {background-color: #bad5fa;}
.ͼm .cm-panels {background-color: #f6f6f6; color: #3f4a54;}
.ͼm .cm-panels.cm-panels-top {border-bottom: 1px solid var(--md-border-color);}
.ͼm .cm-panels.cm-panels-bottom {border-top: 1px solid var(--md-border-color);}
.ͼm .cm-searchMatch {background-color: #72a1ff59; outline: 1px solid #457dff;}
.ͼm .cm-searchMatch.cm-searchMatch-selected {background-color: #6199ff2f;}
.ͼm .cm-activeLine {background-color: #ceedfa33;}
.ͼm .cm-selectionMatch {background-color: #aafe661a;}
.ͼm.cm-focused .cm-matchingBracket, .ͼm.cm-focused .cm-nonmatchingBracket {background-color: #bad0f847;}
.ͼm .cm-gutters {background-color: var(--md-bk-color); color: #3f4a54; border-right: 1px solid; border-color: var(--md-border-color);}
.ͼm .cm-activeLineGutter {background-color: #ceedfa33;}
.ͼm .cm-foldPlaceholder {background-color: transparent; border: none; color: #ddd;}
.ͼm .cm-tooltip {border: 1px solid var(--md-border-color); background-color: var(--md-bk-color);}
.ͼm .cm-tooltip .cm-tooltip-arrow:before {border-top-color: transparent; border-bottom-color: transparent;}
.ͼm .cm-tooltip .cm-tooltip-arrow:after {border-top-color: var(--md-bk-color); border-bottom-color: var(--md-bk-color);}
.ͼm .cm-tooltip-autocomplete > ul > li[aria-selected] {color: #3f4a54;}
.ͼ4 .cm-line ::selection, .ͼ4 .cm-line::selection {background-color: transparent !important;}
.ͼ4 .cm-line {caret-color: transparent !important;}
.ͼ4 .cm-content :focus::selection, .ͼ4 .cm-content :focus ::selection {background-color: Highlight !important;}
.ͼ4 .cm-content :focus {caret-color: initial !important;}
.ͼ4 .cm-content {caret-color: transparent !important;}
</style><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/memocard/favicon.ico"><title>开发指南</title><script defer="defer" src="/memocard/js/chunk-vendors.6381e04c.js"></script><script defer="defer" src="/memocard/js/app.dd06943e.js"></script><link href="/memocard/css/chunk-vendors.ee346564.css" rel="stylesheet"><link href="/memocard/css/app.3ab19182.css" rel="stylesheet"><style type="text/css">.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}</style><style type="text/css" data-primevue-style-id="base">
.p-hidden-accessible {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
.p-hidden-accessible input,
.p-hidden-accessible select {
transform: scale(0);
}
.p-overflow-hidden {
overflow: hidden;
padding-right: var(--scrollbar-width);
}
</style><style type="text/css" data-primevue-style-id="baseicon">
.p-icon {
display: inline-block;
}
.p-icon-spin {
-webkit-animation: p-icon-spin 2s infinite linear;
animation: p-icon-spin 2s infinite linear;
}
@-webkit-keyframes p-icon-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes p-icon-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
</style></head><body><noscript><strong>We're sorry but memocard doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app" data-v-app=""><body><div class="flex justify-content-center"><div class="grid w-12 md:w-10 mt-4"><div class="col-12"><!----><!----><!----><div class="p-card p-component" data-pc-name="card" data-pc-section="root"><div class="p-card-header" data-pc-section="header"><div class="relative flex justify-content-center"><div id="id-question" class="flex align-items-center justify-content-center text-3xl font-bold" contenteditable="true">开发指南</div></div></div><div class="p-card-body" data-pc-section="body"><!----><div class="p-card-content" data-pc-section="content"></div><div class="p-card-footer" data-pc-section="footer"><div id="id-answer"><div id="md-editor-v-0" class="md-editor mt-3"><div class="md-editor-toolbar-wrapper" id="md-editor-v-0-toolbar-wrapper"><div class="md-editor-toolbar"><div class="md-editor-toolbar-left"><div class="md-editor-toolbar-item" title="加粗"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bold-icon md-editor-icon"><path d="M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8"></path></svg><!----></div><div class="md-editor-toolbar-item" title="下划线"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-underline-icon md-editor-icon"><path d="M6 4v6a6 6 0 0 0 12 0V4"></path><line x1="4" x2="20" y1="20" y2="20"></line></svg><!----></div><div class="md-editor-toolbar-item" title="斜体"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-italic-icon md-editor-icon"><line x1="19" x2="10" y1="4" y2="4"></line><line x1="14" x2="5" y1="20" y2="20"></line><line x1="15" x2="9" y1="4" y2="20"></line></svg><!----></div><div class="md-editor-divider"></div><div class="md-editor-toolbar-item" title="标题"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-heading-icon md-editor-icon"><path d="M6 12h12"></path><path d="M6 20V4"></path><path d="M18 20V4"></path></svg><!----></div><div class="md-editor-dropdown md-editor-dropdown-hidden"><div class="md-editor-dropdown-overlay"><ul class="md-editor-menu" role="menu"><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">一级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">二级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">三级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">四级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">五级标题</li><li class="md-editor-menu-item md-editor-menu-item-title" role="menuitem" tabindex="0">六级标题</li></ul></div></div><div class="md-editor-toolbar-item" title="删除线"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-strikethrough-icon md-editor-icon"><path d="M16 4H9a3 3 0 0 0-2.83 4"></path><path d="M14 12a4 4 0 0 1 0 8H6"></path><line x1="4" x2="20" y1="12" y2="12"></line></svg><!----></div><div class="md-editor-toolbar-item" title="下标"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-subscript-icon md-editor-icon"><path d="m4 5 8 8"></path><path d="m12 5-8 8"></path><path d="M20 19h-4c0-1.5.44-2 1.5-2.5S20 15.33 20 14c0-.47-.17-.93-.48-1.29a2.11 2.11 0 0 0-2.62-.44c-.42.24-.74.62-.9 1.07"></path></svg><!----></div><div class="md-editor-toolbar-item" title="上标"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-superscript-icon md-editor-icon"><path d="m4 19 8-8"></path><path d="m12 19-8-8"></path><path d="M20 12h-4c0-1.5.442-2 1.5-2.5S20 8.334 20 7.002c0-.472-.17-.93-.484-1.29a2.105 2.105 0 0 0-2.617-.436c-.42.239-.738.614-.899 1.06"></path></svg><!----></div><div class="md-editor-toolbar-item" title="引用"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-quote-icon md-editor-icon"><path d="M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z"></path><path d="M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z"></path></svg><!----></div><div class="md-editor-toolbar-item" title="无序列表"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list-icon md-editor-icon"><path d="M3 12h.01"></path><path d="M3 18h.01"></path><path d="M3 6h.01"></path><path d="M8 12h13"></path><path d="M8 18h13"></path><path d="M8 6h13"></path></svg><!----></div><div class="md-editor-toolbar-item" title="有序列表"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list-ordered-icon md-editor-icon"><path d="M10 12h11"></path><path d="M10 18h11"></path><path d="M10 6h11"></path><path d="M4 10h2"></path><path d="M4 6h1v4"></path><path d="M6 18H4c0-1 2-2 2-3s-1-1.5-2-1"></path></svg><!----></div><div class="md-editor-toolbar-item" title="任务列表"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list-todo-icon md-editor-icon"><rect x="3" y="5" width="6" height="6" rx="1"></rect><path d="m3 17 2 2 4-4"></path><path d="M13 6h8"></path><path d="M13 12h8"></path><path d="M13 18h8"></path></svg><!----></div><div class="md-editor-divider"></div><div class="md-editor-toolbar-item" title="行内代码"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-icon md-editor-icon"><polyline points="16 18 22 12 16 6"></polyline><polyline points="8 6 2 12 8 18"></polyline></svg><!----></div><div class="md-editor-toolbar-item" title="块级代码"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-square-code-icon md-editor-icon"><path d="M10 9.5 8 12l2 2.5"></path><path d="m14 9.5 2 2.5-2 2.5"></path><rect width="18" height="18" x="3" y="3" rx="2"></rect></svg><!----></div><div class="md-editor-toolbar-item" title="链接"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link-icon md-editor-icon"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg><!----></div><div class="md-editor-toolbar-item" title="表格"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-table-icon md-editor-icon"><path d="M12 3v18"></path><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M3 9h18"></path><path d="M3 15h18"></path></svg><!----></div><div class="md-editor-dropdown md-editor-dropdown-hidden"><div class="md-editor-dropdown-overlay"><div class="md-editor-table-shape"><div class="md-editor-table-shape-row"><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div></div><div class="md-editor-table-shape-row"><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div></div><div class="md-editor-table-shape-row"><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div></div><div class="md-editor-table-shape-row"><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div><div class="md-editor-table-shape-col"><div class="md-editor-table-shape-col-default"></div></div></div></div></div></div><div class="md-editor-toolbar-item" title="mermaid图"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chart-area-icon md-editor-icon"><path d="M3 3v16a2 2 0 0 0 2 2h16"></path><path d="M7 11.207a.5.5 0 0 1 .146-.353l2-2a.5.5 0 0 1 .708 0l3.292 3.292a.5.5 0 0 0 .708 0l4.292-4.292a.5.5 0 0 1 .854.353V16a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"></path></svg><!----></div><div class="md-editor-dropdown md-editor-dropdown-hidden"><div class="md-editor-dropdown-overlay"><ul class="md-editor-menu" role="menu"><li class="md-editor-menu-item md-editor-menu-item-mermaid" role="menuitem" tabindex="0">流程图</li><li class="md-editor-menu-item md-editor-menu-item-mermaid" role="menuitem" tabindex="0">时序图</li><li class="md-editor-menu-item md-editor-menu-item-mermaid" role="menuitem" tabindex="0">甘特图</li><li class="md-editor-menu-item md-editor-menu-item-mermaid" role="menuitem" tabindex="0">类图</li><li class="md-editor-menu-item md-editor-menu-item-mermaid" role="menuitem" tabindex="0">状态图</li><li class="md-editor-menu-item md-editor-menu-item-mermaid" role="menuitem" tabindex="0">饼图</li><li class="md-editor-menu-item md-editor-menu-item-mermaid" role="menuitem" tabindex="0">关系图</li><li class="md-editor-menu-item md-editor-menu-item-mermaid" role="menuitem" tabindex="0">旅程图</li></ul></div></div><div class="md-editor-toolbar-item" title="katex公式"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-square-sigma-icon md-editor-icon"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M16 8.9V7H8l4 5-4 5h8v-1.9"></path></svg><!----></div><div class="md-editor-dropdown md-editor-dropdown-hidden"><div class="md-editor-dropdown-overlay"><ul class="md-editor-menu" role="menu"><li class="md-editor-menu-item md-editor-menu-item-katex" role="menuitem" tabindex="0">行内公式</li><li class="md-editor-menu-item md-editor-menu-item-katex" role="menuitem" tabindex="0">块级公式</li></ul></div></div><div class="md-editor-divider"></div><div class="md-editor-toolbar-item" title="后退"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-reply-icon md-editor-icon"><polyline points="9 17 4 12 9 7"></polyline><path d="M20 18v-2a4 4 0 0 0-4-4H4"></path></svg><!----></div><div class="md-editor-toolbar-item" title="前进"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-forward-icon md-editor-icon"><polyline points="15 17 20 12 15 7"></polyline><path d="M4 18v-2a4 4 0 0 1 4-4h12"></path></svg><!----></div><div class="md-editor-toolbar-item" title="保存"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-save-icon md-editor-icon"><path d="M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"></path><path d="M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"></path><path d="M7 3v4a1 1 0 0 0 1 1h7"></path></svg><!----></div><!----></div><div class="md-editor-toolbar-right"><!----><div class="md-editor-toolbar-item" title="浏览器全屏"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2-icon md-editor-icon"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg><!----></div><div class="md-editor-toolbar-item" title="屏幕全屏"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-expand-icon md-editor-icon"><path d="m21 21-6-6m6 6v-4.8m0 4.8h-4.8"></path><path d="M3 16.2V21m0 0h4.8M3 21l6-6"></path><path d="M21 7.8V3m0 0h-4.8M21 3l-6 6"></path><path d="M3 7.8V3m0 0h4.8M3 3l6 6"></path></svg><!----></div><div class="md-editor-toolbar-item md-editor-toolbar-active" title="预览"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-eye-icon md-editor-icon"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg><!----></div><div class="md-editor-toolbar-item md-editor-toolbar-active" title="仅预览"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-view-icon md-editor-icon"><path d="M21 17v2a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-2"></path><path d="M21 7V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v2"></path><circle cx="12" cy="12" r="1"></circle><path d="M18.944 12.33a1 1 0 0 0 0-.66 7.5 7.5 0 0 0-13.888 0 1 1 0 0 0 0 .66 7.5 7.5 0 0 0 13.888 0"></path></svg><!----></div><div class="md-editor-toolbar-item" title="html代码预览"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml-icon md-editor-icon"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg><!----></div><div class="md-editor-toolbar-item" title="目录"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list-tree-icon md-editor-icon"><path d="M21 12h-8"></path><path d="M21 6H8"></path><path d="M21 18h-8"></path><path d="M3 6v4c0 1.1.9 2 2 2h3"></path><path d="M3 10v6c0 1.1.9 2 2 2h3"></path></svg><!----></div></div></div></div><label for="md-editor-v-0-toolbar-wrapper_label" style="display: none;" aria-label="上传图片"></label><input id="md-editor-v-0-toolbar-wrapper_label" accept="image/*" type="file" multiple="" style="display: none;"><div class="md-editor-content"><div class="md-editor-content-wrapper"><div class="md-editor-input-wrapper" style="width: 0%;"><div class="cm-editor ͼ1 ͼ2 ͼ4 ͼm"><div class="cm-announced" aria-live="polite"></div><div tabindex="-1" class="cm-scroller"><div style="tab-size: 2;" spellcheck="false" autocorrect="off" autocapitalize="none" writingsuggestions="false" translate="no" contenteditable="true" class="cm-content cm-lineWrapping" role="textbox" aria-multiline="true" data-language="markdown" aria-autocomplete="list"><div class="cm-line"><span class="ͼz ͼ11">###</span><span class="ͼz"> 简介</span></div><div class="cm-line">本数据处理程序为用<span class="ͼy ͼ11">[</span><span class="ͼy">Python</span><span class="ͼy ͼ11">]</span><span class="ͼy ͼ11">(</span><span class="ͼy ͼt">https://www.runoob.com/python3/python3-tutorial.html</span><span class="ͼy ͼ11">)</span>编写的通用性框架,可以根据实际项目需求动态配置。可配置的内容在界面上展示为三部分:左侧项目树,中间数据表或图表,右侧交互按钮和输入框。项目树中的每个项目可以包含多个数据表或图表,每个数据表或图表可以对应多个按钮和输入框。配置数据存储于程序所在目录下的./config和./script和./data三个文件夹中。./config文件夹中存放<span class="ͼy ͼ11">[</span><span class="ͼy">YAML</span><span class="ͼy ͼ11">]</span><span class="ͼy ͼ11">(</span><span class="ͼy ͼt">https://www.runoob.com/w3cnote/yaml-intro.html</span><span class="ͼy ͼ11">)</span>格式配置文件,./script文件夹中存放Python脚本./data文件夹中存放CSV格式表格数据。所有配置文件均可直接用记事本等文本编辑器直接打开查看。</div><div class="cm-line"><span class="ͼz ͼ11">###</span><span class="ͼz"> 项目树</span></div><div class="cm-line">项目树由./config/default.yml文件中tree键值配置。tree键值下可以有多个节点每个节点有如下属性</div><div class="cm-line"><span class="ͼ11">-</span> id 必需标识符必须唯一不能重复用于写Python脚本时获取该项目</div><div class="cm-line"><span class="ͼ11">-</span> label (必需)展示在界面上的项目名称</div><div class="cm-line"><span class="ͼ11">-</span> child 可选可包括多个子节点每个节点同样有id、label和child属性子节点要在YAML文件里多一级缩进</div><div class="cm-line"><span class="ͼz ͼ11">###</span><span class="ͼz"> 数据表和图表</span></div><div class="cm-line">数据表和图表由./config/default.yml文件中display键值配置。display键值下面第一级为项目id必须和上面项目树里的id相同。项目id下可有多个数据表或图表每个数据表或图表有如下属性</div><div class="cm-line"><span class="ͼ11">-</span> id 必需标识符必须唯一。用于在Python脚本里访问该表</div><div class="cm-line"><span class="ͼ11">-</span> label (必需)展示在界面上的名称</div><div class="cm-line"><span class="ͼ11">-</span> type 必需类型如果为table则是数据表如果为graph则为图表</div><div class="cm-line">数据表有如下属性:</div><div class="cm-line"><span class="ͼ11">-</span> row (可选)表格行数</div><div class="cm-line"><span class="ͼ11">-</span> col (可选)表格列数</div><div class="cm-line"><span class="ͼ11">-</span> column_header (可选)表头</div><div class="cm-line"><span class="ͼ11">-</span> data (可选)表格数据,比如</div><div class="cm-line"><span class="ͼ11">```</span><span class="ͼp">yaml</span></div><div class="cm-line"><span class="ͼr">-</span> <span class="ͼr">-</span> a</div><div class="cm-line"> <span class="ͼr">-</span> b</div><div class="cm-line"><span class="ͼr">-</span> <span class="ͼr">-</span> d</div><div class="cm-line"> <span class="ͼr">-</span> e</div><div class="cm-line"><span class="ͼ11">```</span></div><div class="cm-line">会展示为</div><div class="cm-line"><br></div><div class="cm-line">| | |</div><div class="cm-line">| - | - |</div><div class="cm-line">| a | b |</div><div class="cm-line">| c | d |</div><div class="cm-line"><br></div><div class="cm-line"><span class="ͼ11">-</span> datafile 可选表格数据文件。与data属性数据直接存放在default.yml文件里不同该属性为csv文件名数据存放在./data文件夹下面的对应文件中</div><div class="cm-line"><span class="ͼ11">-</span> format_script (可选)格式脚本,存放于./script文件夹中。用于指定每个单元格中的数据格式。格式脚本中必须定义table_format函数输入为row行号和col列号返回为格式类型。</div><div class="cm-line"><span class="ͼ11">-</span> span 可选用于合并单元格。span可以包含多项每项4个数字分别是行号、列号、行跨度、列跨度。</div><div class="cm-gap" style="height: 5280px;"></div></div><div class="cm-layer cm-layer-above cm-cursorLayer" aria-hidden="true" style="z-index: 150; animation-duration: 1200ms;"><div class="cm-cursor cm-cursor-primary" style="left: 16px; top: 14.5px; height: 19px;"></div></div><div class="cm-layer cm-selectionLayer" aria-hidden="true" style="z-index: -2;"></div></div></div></div><div class="md-editor-resize-operate" style="left: 50%; display: none;"></div><div id="md-editor-v-0-preview-wrapper" class="md-editor-preview-wrapper"><div id="md-editor-v-0-preview" class="md-editor-preview default-theme md-editor-scrn"><h3 id="简介" data-line="0">简介</h3>
<p data-line="1">本数据处理程序为用<a href="https://www.runoob.com/python3/python3-tutorial.html">Python</a>编写的通用性框架,可以根据实际项目需求动态配置。可配置的内容在界面上展示为三部分:左侧项目树,中间数据表或图表,右侧交互按钮和输入框。项目树中的每个项目可以包含多个数据表或图表,每个数据表或图表可以对应多个按钮和输入框。配置数据存储于程序所在目录下的./config和./script和./data三个文件夹中。./config文件夹中存放<a href="https://www.runoob.com/w3cnote/yaml-intro.html">YAML</a>格式配置文件,./script文件夹中存放Python脚本./data文件夹中存放CSV格式表格数据。所有配置文件均可直接用记事本等文本编辑器直接打开查看。</p>
<h3 id="项目树" data-line="2">项目树</h3>
<p data-line="3">项目树由./config/default.yml文件中tree键值配置。tree键值下可以有多个节点每个节点有如下属性</p>
<ul data-line="4">
<li data-line="4">id 必需标识符必须唯一不能重复用于写Python脚本时获取该项目</li>
<li data-line="5">label (必需)展示在界面上的项目名称</li>
<li data-line="6">child 可选可包括多个子节点每个节点同样有id、label和child属性子节点要在YAML文件里多一级缩进</li>
</ul>
<h3 id="数据表和图表" data-line="7">数据表和图表</h3>
<p data-line="8">数据表和图表由./config/default.yml文件中display键值配置。display键值下面第一级为项目id必须和上面项目树里的id相同。项目id下可有多个数据表或图表每个数据表或图表有如下属性</p>
<ul data-line="9">
<li data-line="9">id 必需标识符必须唯一。用于在Python脚本里访问该表</li>
<li data-line="10">label (必需)展示在界面上的名称</li>
<li data-line="11">type 必需类型如果为table则是数据表如果为graph则为图表<br>
数据表有如下属性:</li>
<li data-line="13">row (可选)表格行数</li>
<li data-line="14">col (可选)表格列数</li>
<li data-line="15">column_header (可选)表头</li>
<li data-line="16">data (可选)表格数据,比如</li>
</ul>
<details open="" class="md-editor-code" data-line="17">
<summary class="md-editor-code-head">
<div class="md-editor-code-flag"><span></span><span></span><span></span></div>
<div class="md-editor-code-action">
<span class="md-editor-code-lang">yaml</span>
<span data-tips="复制代码" class="md-editor-copy-button">复制代码</span>
<span class="md-editor-collapse-tips"><svg class="lucide lucide-circle-chevron-left md-editor-icon" stroke-linejoin="round" stroke-linecap="round" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="24" width="24" xmlns="http://www.w3.org/2000/svg"><circle r="10" cy="12" cx="12"></circle><path d="m14 16-4-4 4-4"></path></svg></span>
</div>
</summary>
<pre><code class="language-yaml"><span class="md-editor-code-block"><span class="hljs-bullet">-</span> <span class="hljs-bullet">-</span> <span class="hljs-string">a</span>
<span class="hljs-bullet">-</span> <span class="hljs-string">b</span>
<span class="hljs-bullet">-</span> <span class="hljs-bullet">-</span> <span class="hljs-string">d</span>
<span class="hljs-bullet">-</span> <span class="hljs-string">e</span></span><span aria-hidden="true"><span></span><span></span><span></span><span></span></span></code></pre>
</details>
<p data-line="23">会展示为</p>
<table data-line="25" style="color:black">
<tbody data-line="27">
<tr data-line="27">
<td>a</td>
<td>b</td>
</tr>
<tr data-line="28">
<td>c</td>
<td>d</td>
</tr>
</tbody>
</table>
<ul data-line="30">
<li data-line="30">datafile 可选表格数据文件。与data属性数据直接存放在default.yml文件里不同该属性为csv文件名数据存放在./data文件夹下面的对应文件中</li>
<li data-line="31">format_script (可选)格式脚本,存放于./script文件夹中。用于指定每个单元格中的数据格式。格式脚本中必须定义table_format函数输入为row行号和col列号返回为格式类型。</li>
<li data-line="32">span 可选用于合并单元格。span可以包含多项每项4个数字分别是行号、列号、行跨度、列跨度。<br>
图表有如下属性:</li>
<li data-line="34">axis_x_title: 横轴标签</li>
<li data-line="35">axis_y_title: 纵轴标签</li>
</ul>
<h3 id="交互按钮和输入框" data-line="36">交互按钮和输入框</h3>
<p data-line="37">交互按钮和输入框由./config/default.yml文件中interact键值配置。interact键值下面第一级为数据表或图表id必须和上面display中的id相同。数据表或图表id下可有多个交互按钮和输入框每个交互按钮和输入框有如下属性</p>
<ul data-line="38">
<li data-line="38">type 必需类型如果为button则是按钮如果为input则是输入框</li>
<li data-line="39">label (必需)展示在界面上的名称<br>
按钮有如下属性</li>
<li data-line="41">script 可选点击该按钮后会运行的Python脚本Python脚本存放在./script文件夹里<br>
输入框有如下属性</li>
<li data-line="43">id 必需标识符必须唯一。用于在Python脚本里获取对应输入</li>
</ul>
<h3 id="Python脚本API" data-line="44">Python脚本API</h3>
<p data-line="45">目前支持对表格的读写和绘图,并不支持动态地创建或删除表格或图表。样例参见./script文件夹里已有脚本。</p>
<details class="md-editor-code" data-line="46">
<summary class="md-editor-code-head">
<div class="md-editor-code-flag"><span></span><span></span><span></span></div>
<div class="md-editor-code-action">
<span class="md-editor-code-lang">python</span>
<span data-tips="复制代码" class="md-editor-copy-button">复制代码</span>
<span class="md-editor-collapse-tips"><svg class="lucide lucide-circle-chevron-left md-editor-icon" stroke-linejoin="round" stroke-linecap="round" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="24" width="24" xmlns="http://www.w3.org/2000/svg"><circle r="10" cy="12" cx="12"></circle><path d="m14 16-4-4 4-4"></path></svg></span>
</div>
</summary>
<pre><code class="language-python"><span class="md-editor-code-block"><span class="hljs-keyword">class</span> <span class="hljs-title class_">project</span>:
list_id = []
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, <span class="hljs-built_in">id</span></span>):
<span class="hljs-variable language_">self</span>.<span class="hljs-built_in">id</span> = <span class="hljs-built_in">id</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__enter__</span>(<span class="hljs-params">self</span>):
project.list_id.append(<span class="hljs-variable language_">self</span>.<span class="hljs-built_in">id</span>)
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__exit__</span>(<span class="hljs-params">self, *args</span>):
project.list_id.pop()
<span class="hljs-keyword">class</span> <span class="hljs-title class_">sheet</span>:
list_widget = []
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, sheet_id</span>):
widget = window.widget_display.map_table[sheet_id]
<span class="hljs-variable language_">self</span>.<span class="hljs-built_in">id</span> = sheet_id
<span class="hljs-variable language_">self</span>.widget = widget
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__enter__</span>(<span class="hljs-params">self</span>):
sheet.list_widget.append(<span class="hljs-variable language_">self</span>.widget)
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__exit__</span>(<span class="hljs-params">self, *args</span>):
sheet.list_widget.pop()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">at</span>(<span class="hljs-params">self, *args</span>):
c = cell(*args, widget = <span class="hljs-variable language_">self</span>.widget)
<span class="hljs-keyword">return</span> c
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__getitem__</span>(<span class="hljs-params">self, index</span>):
<span class="hljs-keyword">if</span> <span class="hljs-built_in">type</span>(index) <span class="hljs-keyword">is</span> <span class="hljs-built_in">tuple</span>:
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.at(*index)
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.at(index)
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">row</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.widget.row
<span class="hljs-meta"> @row.setter</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">row</span>(<span class="hljs-params">self, row</span>):
<span class="hljs-variable language_">self</span>.widget.row = row
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">col</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.widget.col
<span class="hljs-meta"> @col.setter</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">col</span>(<span class="hljs-params">self, col</span>):
<span class="hljs-variable language_">self</span>.widget.col = col
<span class="hljs-keyword">def</span> <span class="hljs-title function_">clear</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.clear()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">clear_content</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.clearContents()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">initial</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.initial()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">reset_content</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.reset_content()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">fit_content</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.widget.fit_content()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">load_data</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.load_data(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">dump_data</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.widget.dump_data(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">load_str</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.load_str(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">dump_str</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.widget.dump_str(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">load_file</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.load_file(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">dump_file</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.dump_file(*arg, **kwarg)
<span class="hljs-keyword">class</span> <span class="hljs-title class_">cell</span>:
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, *arg, widget = <span class="hljs-literal">None</span></span>):
<span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(arg) == <span class="hljs-number">1</span>:
pos = arg[<span class="hljs-number">0</span>]
pos = pos.lower()
row = <span class="hljs-literal">None</span>
col = <span class="hljs-literal">None</span>
<span class="hljs-keyword">match</span> = re.<span class="hljs-keyword">match</span>(<span class="hljs-string">r"([a-z]+)(\d+)"</span>, pos)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-keyword">match</span>:
<span class="hljs-keyword">raise</span> RuntimeError(<span class="hljs-string">f"unrecognized pos: \"<span class="hljs-subst">{pos}</span>\""</span>)
row = <span class="hljs-keyword">match</span>.group(<span class="hljs-number">2</span>)
cl = <span class="hljs-keyword">match</span>.group(<span class="hljs-number">1</span>)
row = <span class="hljs-built_in">int</span>(row) - <span class="hljs-number">1</span>
col = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> <span class="hljs-built_in">chr</span> <span class="hljs-keyword">in</span> cl:
col *= <span class="hljs-number">26</span>
col += <span class="hljs-built_in">ord</span>(<span class="hljs-built_in">chr</span>) - <span class="hljs-built_in">ord</span>(<span class="hljs-string">"a"</span>)
<span class="hljs-keyword">elif</span> <span class="hljs-built_in">len</span>(arg) == <span class="hljs-number">2</span>:
row = arg[<span class="hljs-number">0</span>]
col = arg[<span class="hljs-number">1</span>]
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">raise</span> RuntimeError(<span class="hljs-string">"The number of params should not be more than 2"</span>)
<span class="hljs-variable language_">self</span>.item = <span class="hljs-literal">None</span>
<span class="hljs-keyword">if</span> widget <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span> <span class="hljs-keyword">and</span> sheet.list_widget:
widget = sheet.list_widget[-<span class="hljs-number">1</span>]
<span class="hljs-keyword">if</span> widget:
<span class="hljs-variable language_">self</span>.item = widget.at(row, col)
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.item.text
<span class="hljs-meta"> @text.setter</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">text</span>(<span class="hljs-params">self, s</span>):
<span class="hljs-variable language_">self</span>.item.text = s
<span class="hljs-meta"> @property</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">value</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.item.value
<span class="hljs-meta"> @value.setter</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">value</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-variable language_">self</span>.item.value = v
<span class="hljs-keyword">def</span> <span class="hljs-title function_">empty</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.item.empty()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">clear</span>(<span class="hljs-params">self</span>):
<span class="hljs-variable language_">self</span>.item.value = <span class="hljs-literal">None</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">graph</span>:
list_widget = []
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, graph_id</span>):
widget = window.widget_display.map_graph[graph_id]
<span class="hljs-variable language_">self</span>.<span class="hljs-built_in">id</span> = graph_id
<span class="hljs-variable language_">self</span>.widget = widget
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__enter__</span>(<span class="hljs-params">self</span>):
graph.list_widget.append(<span class="hljs-variable language_">self</span>.widget)
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__exit__</span>(<span class="hljs-params">self, *args</span>):
graph.list_widget.pop()
<span class="hljs-keyword">def</span> <span class="hljs-title function_">plot</span>(<span class="hljs-params">self, *arg, **kwarg</span>):
<span class="hljs-variable language_">self</span>.widget.plot(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">plot</span>(<span class="hljs-params">*arg, **kwarg</span>):
widget = graph.list_widget[-<span class="hljs-number">1</span>]
widget.plot(*arg, **kwarg)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">param</span>(<span class="hljs-params"><span class="hljs-built_in">id</span></span>):
map_input = window.widget_interact.widget_grid.map_input
result = map_input.get(<span class="hljs-built_in">id</span>)
<span class="hljs-keyword">return</span> result</span><span aria-hidden="true"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
</details>
<details class="md-editor-code" data-line="212">
<summary class="md-editor-code-head">
<div class="md-editor-code-flag"><span></span><span></span><span></span></div>
<div class="md-editor-code-action">
<span class="md-editor-code-lang">Python</span>
<span data-tips="复制代码" class="md-editor-copy-button">复制代码</span>
<span class="md-editor-collapse-tips"><svg class="lucide lucide-circle-chevron-left md-editor-icon" stroke-linejoin="round" stroke-linecap="round" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="24" width="24" xmlns="http://www.w3.org/2000/svg"><circle r="10" cy="12" cx="12"></circle><path d="m14 16-4-4 4-4"></path></svg></span>
</div>
</summary>
<pre><code class="language-Python"><span class="md-editor-code-block"><span class="hljs-keyword">class</span> <span class="hljs-title class_">string</span>:
dtype = <span class="hljs-built_in">str</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">pass</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
<span class="hljs-keyword">return</span> s
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-keyword">return</span> v
<span class="hljs-keyword">class</span> <span class="hljs-title class_">integer</span>:
dtype = <span class="hljs-built_in">int</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, fmt = <span class="hljs-string">"%d"</span></span>):
<span class="hljs-variable language_">self</span>.fmt = fmt
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
s = s.strip()
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> s:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">try</span>:
v = <span class="hljs-built_in">int</span>(s)
<span class="hljs-keyword">except</span>:
v = <span class="hljs-built_in">int</span>(<span class="hljs-built_in">float</span>(s))
<span class="hljs-keyword">return</span> v
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.fmt % v
<span class="hljs-keyword">class</span> <span class="hljs-title class_">decimal</span>:
dtype = <span class="hljs-built_in">float</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, fmt = <span class="hljs-string">"%.3f"</span>, epsilon = <span class="hljs-number">1e-4</span></span>):
<span class="hljs-variable language_">self</span>.fmt = fmt
<span class="hljs-variable language_">self</span>.epsilon = epsilon
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
s = s.strip()
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> s:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">return</span> <span class="hljs-built_in">float</span>(s)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-keyword">if</span> <span class="hljs-built_in">abs</span>(v) &lt; <span class="hljs-variable language_">self</span>.epsilon:
v = <span class="hljs-number">0.0</span>
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">self</span>.fmt % v
<span class="hljs-keyword">class</span> <span class="hljs-title class_">kdecimal</span>:
dtype = <span class="hljs-built_in">float</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, fmt = <span class="hljs-string">"%07.3f"</span>, epsilon = <span class="hljs-number">1e-4</span></span>):
<span class="hljs-variable language_">self</span>.fmt = fmt
<span class="hljs-variable language_">self</span>.epsilon = epsilon
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
s = s.strip()
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> s:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">match</span> = re.<span class="hljs-keyword">match</span>(<span class="hljs-string">r"[kK](\d+)\+(\d+(?:\.\d+)?)"</span>, s)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">match</span> <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:
<span class="hljs-keyword">raise</span> RuntimeError(<span class="hljs-string">f"pattern not matched: <span class="hljs-subst">{s}</span>"</span>)
a = <span class="hljs-keyword">match</span>.group(<span class="hljs-number">1</span>)
b = <span class="hljs-keyword">match</span>.group(<span class="hljs-number">2</span>)
<span class="hljs-keyword">return</span> <span class="hljs-built_in">float</span>(a + b)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
a = v // <span class="hljs-number">1000</span>
b = v % <span class="hljs-number">1000</span>
<span class="hljs-keyword">if</span> <span class="hljs-built_in">abs</span>(b - <span class="hljs-number">1000</span>) &lt; <span class="hljs-variable language_">self</span>.epsilon:
a += <span class="hljs-number">1</span>
b = <span class="hljs-number">0.0</span>
<span class="hljs-keyword">elif</span> <span class="hljs-built_in">abs</span>(b) &lt; <span class="hljs-variable language_">self</span>.epsilon:
b = <span class="hljs-number">0.0</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">f"K%d+<span class="hljs-subst">{self.fmt}</span>"</span> % (a, b)
<span class="hljs-keyword">class</span> <span class="hljs-title class_">angle</span>:
dtype = <span class="hljs-built_in">float</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):
<span class="hljs-keyword">pass</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">str2val</span>(<span class="hljs-params">self, s</span>):
s = s.strip()
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> s:
<span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
<span class="hljs-keyword">match</span> = re.<span class="hljs-keyword">match</span>(<span class="hljs-string">r"(\d+)°(\d+)(\d+(?:\.\d+)?)″"</span>, s)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">match</span> <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:
<span class="hljs-keyword">raise</span> RuntimeError(<span class="hljs-string">f"pattern not matched: <span class="hljs-subst">{s}</span>"</span>)
d = <span class="hljs-built_in">int</span>(<span class="hljs-keyword">match</span>.group(<span class="hljs-number">1</span>))
m = <span class="hljs-built_in">int</span>(<span class="hljs-keyword">match</span>.group(<span class="hljs-number">2</span>))
s = <span class="hljs-built_in">float</span>(<span class="hljs-keyword">match</span>.group(<span class="hljs-number">3</span>))
<span class="hljs-keyword">return</span> dms2rad(d, m, s)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">val2str</span>(<span class="hljs-params">self, v</span>):
<span class="hljs-keyword">return</span> <span class="hljs-string">"%2d°%02d%05.2f″"</span> % rad2dms(v)</span><span aria-hidden="true"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
</details>
</div></div><!----></div><!----></div><div class="md-editor-footer"><div class="md-editor-footer-left"><div class="md-editor-footer-item"><label class="md-editor-footer-label">字数:</label><span>6503</span></div></div><div class="md-editor-footer-right"><!----><!----></div></div></div></div></div></div></div></div></div></div></body></div><div class="p-toast p-component p-toast-bottom-right p-ripple-disabled" style="position: fixed; right: 20px; bottom: 20px;" data-pc-name="toast" data-pc-section="root"><div data-pc-section="message"></div></div><div class="md-editor-modal-container" data-theme="light"><div style="display: none;"><div class="md-editor-modal-mask" style="z-index: -1;"></div><div class="md-editor-modal" style="z-index: -1; left: 0px; top: 0px; width: auto; height: auto;"><div class="md-editor-modal-header">添加链接</div><div class="md-editor-modal-body"><div class="md-editor-form-item"><label class="md-editor-label" for="link-desc-md-editor-v-0">链接描述:</label><input placeholder="请输入描述..." class="md-editor-input" id="link-desc-md-editor-v-0" type="text" autocomplete="off" value=""></div><div class="md-editor-form-item"><label class="md-editor-label" for="link-url-md-editor-v-0">链接地址:</label><input placeholder="请输入链接..." class="md-editor-input" id="link-url-md-editor-v-0" type="text" autocomplete="off" value=""></div><div class="md-editor-form-item"><button class="md-editor-btn md-editor-btn-row" type="button">确定</button></div></div><div class="md-editor-modal-func"><!----><div class="md-editor-modal-close"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-xicon md-editor-icon"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></div></div></div></div></div><div class="md-editor-modal-container" data-theme="light"><div class="md-editor-modal-clip" style="display: none;"><div class="md-editor-modal-mask" style="z-index: -1;"></div><div class="md-editor-modal" style="z-index: -1; left: 0px; top: 0px; width: 668px; height: 421px;"><div class="md-editor-modal-header">裁剪图片上传</div><div class="md-editor-modal-body"><div class="md-editor-form-item md-editor-clip"><div class="md-editor-clip-main"><div class="md-editor-clip-upload" role="button" tabindex="0" aria-label="上传图片"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-upload-icon md-editor-icon"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" x2="12" y1="3" y2="15"></line></svg></div></div><div class="md-editor-clip-preview"><div class="md-editor-clip-preview-target"></div></div></div><div class="md-editor-form-item"><button class="md-editor-btn" type="button">上传</button></div><input accept="image/*" type="file" style="display: none;" aria-hidden="true"></div><div class="md-editor-modal-func"><div class="md-editor-modal-adjust"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2-icon md-editor-icon"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></div><div class="md-editor-modal-close"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-xicon md-editor-icon"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></div></div></div></div></div></body>