修改部分规则模块删除无用前端 新增前端界面

This commit is contained in:
zouju
2026-02-06 17:22:22 +08:00
parent 000f8d4bc5
commit a440094138
583 changed files with 26241 additions and 26046 deletions

1184
modeler/.editorconfig Normal file

File diff suppressed because it is too large Load Diff

0
modeler/.env Normal file
View File

17
modeler/.env.development Normal file
View File

@@ -0,0 +1,17 @@
#
# This file is part of the kernelstudio package.
#
# (c) 2014-2025 zlin <admin@kernelstudio.com>
#
# For the full copyright and license information, please view the LICENSE file
# that was distributed with this source code.
#
NODE_ENV=development
APP_BASE_URL=/
APP_API_URL=/api/v1
APP_API_TIMEOUT=60000
APP_PORT=9999
APP_PROXY_HOST=http://127.0.0.1
APP_PROXY_PORT=12000
APP_ASSETS_HOST=http://127.0.0.1:9999
APP_DIST_DIR=assets/web

16
modeler/.env.production Normal file
View File

@@ -0,0 +1,16 @@
#
# This file is part of the kernelstudio package.
#
# (c) 2014-2025 zlin <admin@kernelstudio.com>
#
# For the full copyright and license information, please view the LICENSE file
# that was distributed with this source code.
#
APP_BASE_URL=/
APP_API_URL=/api/v1
APP_API_TIMEOUT=60000
APP_PORT=9999
APP_PROXY_HOST=http://127.0.0.1
APP_PROXY_PORT=12000
APP_ASSETS_HOST=http://app.kernelstudio.com
APP_DIST_DIR=assets/web

View File

@@ -0,0 +1,98 @@
{
"globals": {
"Component": true,
"ComponentPublicInstance": true,
"ComputedRef": true,
"DirectiveBinding": true,
"EffectScope": true,
"ExtractDefaultPropTypes": true,
"ExtractPropTypes": true,
"ExtractPublicPropTypes": true,
"InjectionKey": true,
"MaybeRef": true,
"MaybeRefOrGetter": true,
"PropType": true,
"Ref": true,
"ShallowRef": true,
"Slot": true,
"Slots": true,
"VNode": true,
"WritableComputedRef": true,
"acceptHMRUpdate": true,
"computed": true,
"createApp": true,
"createPinia": true,
"customRef": true,
"defineAsyncComponent": true,
"defineComponent": true,
"defineStore": true,
"effectScope": true,
"getActivePinia": true,
"getCurrentInstance": true,
"getCurrentScope": true,
"getCurrentWatcher": true,
"inject": true,
"isProxy": true,
"isReactive": true,
"isReadonly": true,
"isRef": true,
"isShallow": true,
"mapActions": true,
"mapGetters": true,
"mapState": true,
"mapStores": true,
"mapWritableState": true,
"markRaw": true,
"nextTick": true,
"onActivated": true,
"onBeforeMount": true,
"onBeforeRouteLeave": true,
"onBeforeRouteUpdate": true,
"onBeforeUnmount": true,
"onBeforeUpdate": true,
"onDeactivated": true,
"onErrorCaptured": true,
"onMounted": true,
"onRenderTracked": true,
"onRenderTriggered": true,
"onScopeDispose": true,
"onServerPrefetch": true,
"onUnmounted": true,
"onUpdated": true,
"onWatcherCleanup": true,
"provide": true,
"reactive": true,
"readonly": true,
"ref": true,
"resolveComponent": true,
"setActivePinia": true,
"setMapStoreSuffix": true,
"shallowReactive": true,
"shallowReadonly": true,
"shallowRef": true,
"storeToRefs": true,
"toRaw": true,
"toRef": true,
"toRefs": true,
"toValue": true,
"triggerRef": true,
"unref": true,
"useAttrs": true,
"useClipboard": true,
"useCssModule": true,
"useCssVars": true,
"useDebounceFn": true,
"useId": true,
"useLink": true,
"useLocalStorage": true,
"useModel": true,
"useRoute": true,
"useRouter": true,
"useSlots": true,
"useTemplateRef": true,
"watch": true,
"watchEffect": true,
"watchPostEffect": true,
"watchSyncEffect": true
}
}

15
modeler/.gitattributes vendored Normal file
View File

@@ -0,0 +1,15 @@
# .gitattributes
* text=auto eol=lf
*.html text eol=lf
*.css text eol=lf
*.js text eol=lf
*.scss text eol=lf
*.hbs text eol=lf
*.sh text eol=lf
*.md text eol=lf
*.json text eol=lf
*.yml text eol=lf
.browserslistrc text eol=lf
.gitignore text eol=lf
*.js linguist-detectable=true
*.vue linguist-detectable=true

13
modeler/.prettierignore Normal file
View File

@@ -0,0 +1,13 @@
/dist/*
/docs/*
.local
.output.js
auto-imports.d.ts
/node_modules/**
**/*.svg
**/*.sh
/public/*
/tmp/*

19
modeler/.prettierrc Normal file
View File

@@ -0,0 +1,19 @@
{
"printWidth": 200,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"vueIndentScriptAndStyle": true,
"singleQuote": true,
"quoteProps": "as-needed",
"bracketSpacing": true,
"trailingComma": "es5",
"jsxBracketSameLine": true,
"jsxSingleQuote": false,
"arrowParens": "always",
"insertPragma": false,
"requirePragma": false,
"proseWrap": "preserve",
"htmlWhitespaceSensitivity": "strict",
"endOfLine": "lf"
}

6
modeler/.stylelintignore Normal file
View File

@@ -0,0 +1,6 @@
/dist/*
/public/*
/docs/*
/tmp/*
/bin/*
/config/*

7
modeler/.vercelignore Normal file
View File

@@ -0,0 +1,7 @@
node_modules
.git
*.log
.DS_Store
dist
.vscode
.idea

3
modeler/.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}

5
modeler/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Vue 3 + TypeScript + Vite
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).

View File

@@ -0,0 +1,10 @@
FROM grafana/grafana-enterprise:v12.3.1
USER root
RUN mkdir -p /usr/share/grafana/public/views \
&& rm -rf /var/lib/apt/lists/*
COPY --chown=grafana:grafana ./views /usr/share/grafana/public/views
USER grafana

View File

@@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width" />
<meta name="theme-color" content="#000" />
<title>[[.AppTitle]] - Error</title>
<base href="[[.AppSubUrl]]/" />
[[ if eq .ThemeType "light" ]]
<link rel="stylesheet" href="[[.Assets.Light]]" />
[[ else ]]
<link rel="stylesheet" href="[[.Assets.Dark]]" />
[[ end ]]
<link rel="icon" type="image/png" href="public/img/fav32.png" />
<link rel="mask-icon" href="public/img/grafana_mask_icon.svg" color="#F05A28" />
</head>
<body class="theme-[[ .ThemeType ]]">
<div class="main-view">
<div class="page-container">
<div class="page-header">
<div class="page-header__inner">
<span class="page-header__logo">
<i class="page-header__icon fa fa-frown-o"></i>
</span>
<div class="page-header__info-block">
<h1 class="page-header__title">
<a class="text-link" href="login">Grafana</a><span> / Server Error</span><span></span>
</h1>
<div class="page-header__sub-title">Sadly something went wrong</div>
</div>
</div>
</div>
</div>
<div class="page-container page-body ng-scope" style="padding: 2rem">
<div class="alert">
<div class="alert-icon"><icon name="'exclamation-triangle'"></icon></div>
<div class="alert-body">
<div class="alert-title">[[.Title]]</div>
</div>
</div>
<br />
[[if .ErrorMsg]]
<h4 class="page-heading">Error details</h4>
<div class="alert-text">
<pre>[[.ErrorMsg]]</pre>
</div>
[[end]]
<div style="padding: 2rem 0 0">
<p>Check the Grafana server logs for the detailed error message.</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,387 @@
<!DOCTYPE html>
<html lang="[[.User.Language]]">
<head>
[[ if and .CSPEnabled .IsDevelopmentEnv ]]
<!-- Cypress overwrites CSP headers in HTTP requests, so this is required for e2e tests-->
<meta http-equiv="Content-Security-Policy" content="[[.CSPContent]]"/>
[[ end ]]
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width" />
<meta name="theme-color" content="#000" />
<title>[[.AppTitle]]</title>
<base href="[[.AppSubUrl]]/" />
<link rel="icon" type="image/png" href="[[.FavIcon]]" />
<link rel="apple-touch-icon" sizes="180x180" href="[[.AppleTouchIcon]]" />
<link rel="mask-icon" href="[[.Assets.ContentDeliveryURL]]public/img/grafana_mask_icon.svg" color="#F05A28" />
[[range $asset := .Assets.CSSFiles]]
<link rel="stylesheet" href="[[$asset.FilePath]]" />
[[end]]
<!-- If theme is "system", we inject the stylesheets with javascript further down the page -->
[[ if eq .ThemeType "light" ]]
<link rel="stylesheet" href="[[.Assets.Light]]" />
[[ else if eq .ThemeType "dark" ]]
<link rel="stylesheet" href="[[.Assets.Dark]]" />
[[ end ]]
<script nonce="[[.Nonce]]">
performance.mark('frontend_boot_css_time_seconds');
</script>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="msapplication-TileColor" content="#2b5797" />
<meta name="msapplication-config" content="public/img/browserconfig.xml" />
</head>
<body class="theme-[[ .ThemeType ]] [[.AppNameBodyClass]]">
<style>
.preloader {
height: 100%;
flex-direction: column;
display: flex;
justify-content: center;
align-items: center;
margin: 0 32px;
}
.preloader__enter {
opacity: 0;
animation-name: preloader-fade-in;
animation-iteration-count: 1;
animation-duration: 0.9s;
animation-delay: 0.5s;
animation-fill-mode: forwards;
}
.preloader__bounce {
text-align: center;
animation-name: preloader-bounce;
animation-duration: 0.9s;
animation-iteration-count: infinite;
}
.preloader__logo {
display: inline-block;
animation-name: preloader-squash;
animation-duration: 0.9s;
animation-iteration-count: infinite;
width: 60px;
height: 60px;
background-repeat: no-repeat;
background-size: contain;
background-image: url('[[.LoadingLogo]]');
}
.preloader__text {
margin-top: 16px;
font-weight: 500;
font-size: 14px;
font-family: Sans-serif;
opacity: 0;
animation-name: preloader-fade-in;
animation-duration: 0.9s;
animation-delay: 0.5s;
animation-fill-mode: forwards;
}
.theme-light .preloader__text {
color: #52545c;
}
.theme-dark .preloader__text {
color: #d8d9da;
}
@keyframes preloader-fade-in {
0% {
opacity: 0;
/*animation-timing-function: linear;*/
animation-timing-function: cubic-bezier(0, 0, 0.5, 1);
}
100% {
opacity: 1;
}
}
@keyframes preloader-bounce {
from,
to {
transform: translateY(0px);
animation-timing-function: cubic-bezier(0.3, 0, 0.1, 1);
}
50% {
transform: translateY(-50px);
animation-timing-function: cubic-bezier(0.9, 0, 0.7, 1);
}
}
@keyframes preloader-squash {
0% {
transform: scaleX(1.3) scaleY(0.8);
animation-timing-function: cubic-bezier(0.3, 0, 0.1, 1);
}
15% {
transform: scaleX(0.75) scaleY(1.25);
animation-timing-function: cubic-bezier(0, 0, 0.7, 0.75);
}
55% {
transform: scaleX(1.05) scaleY(0.95);
animation-timing-function: cubic-bezier(0.9, 0, 1, 1);
}
95% {
transform: scaleX(0.75) scaleY(1.25);
animation-timing-function: cubic-bezier(0, 0, 0, 1);
}
100% {
transform: scaleX(1.3) scaleY(0.8);
animation-timing-function: cubic-bezier(0, 0, 0.7, 1);
}
}
/* Fail info */
.preloader__text--fail {
display: none;
}
/* stop logo animation */
.preloader--done .preloader__bounce,
.preloader--done .preloader__logo {
animation-name: none;
display: none;
}
.preloader--done .preloader__logo,
.preloader--done .preloader__text {
display: none;
color: #ff5705 !important;
font-size: 15px;
}
.theme-light .preloader--done .preloader__text {
color: #52545c !important;
}
.preloader--done .preloader__text--fail {
display: block;
}
.preloader--done .preloader__text--fail a {
color: white;
}
.theme-light .preloader--done .preloader__text--fail a {
color: rgb(31, 98, 224);
}
.preloader--done code {
white-space: nowrap;
padding: 2px 5px;
margin: 0px 2px;
font-size: 0.8rem;
background-color: rgb(24, 27, 31);
color: rgb(204, 204, 220);
border: 1px solid rgba(204, 204, 220, 0.2);
border-radius: 4px;
}
.preloader__error-list li {
margin-bottom: 8px;
}
[ng\:cloak],
[ng-cloak],
.ng-cloak {
display: none !important;
}
</style>
<div class="preloader">
<div class="preloader__enter">
<div class="preloader__bounce">
<div class="preloader__logo" aria-live="polite" role="status" aria-label="Loading Grafana"></div>
</div>
</div>
<div class="preloader__text preloader__text--fail">
<main>
<h1>If you're seeing this Grafana has failed to load its application files</h1>
<ol class="preloader__error-list">
<li>This could be caused by your reverse proxy settings.</li>
<li>If you host grafana under a subpath make sure your <code>grafana.ini</code> <code>root_url</code> setting
includes subpath. If not using a reverse proxy make sure to set <code>serve_from_sub_path</code> to true.</li>
<li>If you have a local dev build make sure you build frontend using: <code>yarn start</code>, or
<code>yarn build</code>.</li>
<li>Sometimes restarting <code>grafana-server</code> can help.</li>
<li>Check if you are using a non-supported browser. For more information, refer to the list of
<a href="https://grafana.com/docs/grafana/latest/installation/requirements/#supported-web-browsers">
supported browsers </a
>.</li>
</ol>
</main>
</div>
<script nonce="[[.Nonce]]">
// Check to see if browser is not supported by Grafana
// Source file in app/core/utils/browser.ts & tests make edits there and copy compiled typescript here
function checkBrowserCompatibility() {
var isIE = navigator.userAgent.indexOf('MSIE') > -1;
var isEdge = navigator.userAgent.indexOf('Edge/') > -1 || navigator.userAgent.indexOf('Edg/') > -1;
var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
/* Check for
<= IE11 (Trident 7)
Edge <= 16
Firefox <= 64
Chrome <= 54
*/
var isEdgeVersion = /Edge\/([0-9.]+)/.exec(navigator.userAgent);
if (isIE && parseFloat(/Trident\/([0-9.]+)/.exec(navigator.userAgent)[1]) <= 7) {
return false;
} else if (
isEdge &&
((isEdgeVersion && parseFloat(isEdgeVersion[1]) <= 16) ||
parseFloat(/Edg\/([0-9.]+)/.exec(navigator.userAgent)[1]) <= 16)
) {
return false;
} else if (isFirefox && parseFloat(/Firefox\/([0-9.]+)/.exec(navigator.userAgent)[1]) <= 64) {
return false;
} else if (isChrome && parseFloat(/Chrome\/([0-9.]+)/.exec(navigator.userAgent)[1]) <= 54) {
return false;
}
return true;
}
if (!checkBrowserCompatibility()) {
alert('Your browser is not fully supported, please try newer version.');
}
</script>
</div>
<div id="reactRoot"></div>
<script nonce="[[.Nonce]]">
window.grafanaBootData = {
user: [[.User]],
settings: [[.Settings]],
navTree: [[.NavTree]],
assets: [[.Assets]]
};
// FEMT index.html uses this, and we want to keep the index.ts the same for both
window.__grafana_boot_data_promise = Promise.resolve();
// Set theme to match system only on startup.
// Do not react to changes in system theme after startup.
if (window.grafanaBootData.user.theme === "system") {
document.body.classList.remove("theme-system");
var darkQuery = window.matchMedia("(prefers-color-scheme: dark)");
var cssLink = document.createElement("link");
cssLink.rel = 'stylesheet';
if (darkQuery.matches) {
document.body.classList.add("theme-dark");
cssLink.href = window.grafanaBootData.assets.dark;
window.grafanaBootData.user.lightTheme = false;
} else {
document.body.classList.add("theme-light");
cssLink.href = window.grafanaBootData.assets.light;
window.grafanaBootData.user.lightTheme = true;
}
document.head.appendChild(cssLink);
}
window.__grafana_load_failed = function() {
var preloader = document.getElementsByClassName("preloader");
if (preloader.length) {
preloader[0].className = "preloader preloader--done";
}
}
// In case the js files fails to load the code below will show an info message.
window.onload = function() {
if (window.__grafana_app_bundle_loaded) {
return;
}
window.__grafana_load_failed();
};
[[if .Assets.ContentDeliveryURL]]
window.public_cdn_path = '[[.Assets.ContentDeliveryURL]]public/build/';
[[end]]
[[if .Nonce]]
window.nonce = '[[.Nonce]]';
[[end]]
</script>
[[if .GoogleTagManagerId]]
<!-- Google Tag Manager -->
<script nonce="[[.Nonce]]">
dataLayer = [
{
IsSignedIn: '[[.User.IsSignedIn]]',
Email: '[[.User.Email]]',
Name: '[[.User.Name]]',
UserId: '[[.User.Id]]',
OrgId: '[[.User.OrgId]]',
OrgName: '[[.User.OrgName]]',
},
];
</script>
<noscript>
<iframe
src="//www.googletagmanager.com/ns.html?id=[[.GoogleTagManagerId]]"
height="0"
width="0"
style="display: none; visibility: hidden"
></iframe>
</noscript>
<script nonce="[[.Nonce]]">
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = '//www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', '[[.GoogleTagManagerId]]');
</script>
<!-- End Google Tag Manager -->
[[end]]
[[if .Settings.FeatureToggles.assetSriChecks ]]
[[range $asset := .Assets.JSFiles]]
<script
nonce="[[$.Nonce]]"
src="[[$asset.FilePath]]"
integrity="[[$asset.Integrity]]"
crossorigin="anonymous"
type="text/javascript"
defer
></script>
[[end]]
[[else]]
[[range $asset := .Assets.JSFiles]]
<script
nonce="[[$.Nonce]]"
src="[[$asset.FilePath]]"
type="text/javascript"
defer
></script>
[[end]]
[[end]]
<script nonce="[[.Nonce]]">
performance.mark('frontend_boot_js_done_time_seconds');
</script>
</body>
</html>

View File

@@ -0,0 +1,39 @@
<!doctype html>
<html lang="en">
<head>
[[ if and .CSPEnabled .IsDevelopmentEnv ]]
<!-- Cypress overwrites CSP headers in HTTP requests, so this is required for e2e tests-->
<meta http-equiv="Content-Security-Policy" content="[[.CSPContent]]" />
[[ end ]]
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width" />
<meta name="theme-color" content="#000" />
<title>Grafana API Reference</title>
[[range $asset := .Assets.SwaggerCSSFiles]]
<link rel="stylesheet" href="[[$asset.FilePath]]" />
[[end]]
<link rel="stylesheet" href="[[.Assets.Light]]" />
<link rel="icon" type="image/png" href="[[.FavIcon]]" />
<link rel="apple-touch-icon" sizes="180x180" href="[[.AppleTouchIcon]]" />
<link rel="mask-icon" href="[[.Assets.ContentDeliveryURL]]public/img/grafana_mask_icon.svg" color="#F05A28" />
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<script nonce="[[$.Nonce]]">
[[if .Assets.ContentDeliveryURL]]
window.public_cdn_path = '[[.Assets.ContentDeliveryURL]]public/build/';
[[end]]
</script>
<div id="root"></div>
[[range $asset := .Assets.Swagger]]
<script nonce="[[$.Nonce]]" src="[[$asset.FilePath]]" type="text/javascript"></script>
[[end]]
<script></script>
</body>
</html>

98
modeler/config/nginx.conf Normal file
View File

@@ -0,0 +1,98 @@
server {
listen 80;
server_name monitor.kernelstudio.com;
include server/error.conf;
access_log /var/log/nginx/monitor.kernelstudio.com.access.log access;
error_log /var/log/nginx/monitor.kernelstudio.com.error.log debug; # 临时开启debug排查WS错误
# 核心:屏蔽后端 X-Frame-Options + 统一设置
proxy_hide_header X-Frame-Options;
add_header X-Frame-Options "sameorigin" always;
# 全局跨域头(开发环境)
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS" always;
add_header Access-Control-Allow-Headers "Content-Type,Authorization,X-Grafana-Org-Id,Upgrade,Connection" always;
# 允许跨域预检请求OPTIONS
if ($request_method = OPTIONS) {
return 204;
}
# 全局 proxy 基础配置
proxy_http_version 1.1;
proxy_connect_timeout 60s;
proxy_set_header X-Host $host;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ========== 最高优先级Grafana Live WS覆盖所有带参数的WS请求 ==========
# 正则匹配 /api/live/ws 及后续所有参数/路径
location ~ ^/api/live/ws {
# WebSocket 必须的头部
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 保持其他头部传递
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 超时设置
proxy_read_timeout 86400;
proxy_connect_timeout 86400;
proxy_send_timeout 86400;
# 禁用缓冲
proxy_buffering off;
proxy_cache off;
proxy_pass http://192.168.1.200:3000;
}
# ========== 次优先级Grafana 其他 API/页面路径 ==========
# 1. 匹配 /apis/带s开头的所有路径
location ~ ^/apis/ {
proxy_next_upstream http_500 http_502 http_504 error timeout invalid_header;
proxy_read_timeout 300s;
proxy_pass http://192.168.1.200:3000;
}
# 2. 匹配 /api/ 下的 Grafana 核心 API排除 live/ws已单独匹配
location ~ ^/api/(user|frontend-metrics|datasources|ds|dashboards|prometheus|plugins|features\.grafana\.ap|public)($|/) {
proxy_next_upstream http_500 http_502 http_504 error timeout invalid_header;
proxy_read_timeout 300s;
proxy_pass http://192.168.1.200:3000;
}
# 3. 匹配 Grafana 页面路径
location ~ ^/(d|login|public|avatar)($|/) {
proxy_next_upstream http_500 http_502 http_504 error timeout invalid_header;
proxy_read_timeout 300s;
proxy_pass http://192.168.1.200:3000;
}
# ========== Vite 相关路径(最后匹配) ==========
# 1. Vite HMR 的 WebSocket 路径
location /ws {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400s;
proxy_pass http://192.168.1.200:8888;
}
# 2. Vite 开发环境兜底
location / {
include custom/api.access.conf;
proxy_next_upstream http_500 http_502 http_504 error timeout invalid_header;
# 禁用缓存
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
add_header Pragma "no-cache" always;
add_header Expires "0" always;
proxy_pass http://192.168.1.200:8888;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 698 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 KiB

13
modeler/index.html Normal file
View File

@@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>博弈竞赛环境</title>
</head>
<body>
<div id="app" class="w-full h-full"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

46
modeler/jsconfig.json Normal file
View File

@@ -0,0 +1,46 @@
{
"compilerOptions": {
"target": "es6",
"baseUrl": ".",
"paths": {
"@/*": [
"src/*"
],
"@/views/*": [
"src/views/*"
],
"@/components/*": [
"src/components/*"
],
"@/assets/*": [
"src/assets/*"
],
"@/config/*": [
"src/config/*"
],
"@/core/*": [
"src/core/*"
],
"@/api/*": [
"src/api/*"
],
"@/stores/*": [
"src/stores/*"
],
"@/utils/*": [
"src/utils/*"
]
}
},
"exclude": [
"node_modules",
"dist",
"docs",
"tmp",
"config",
"public"
],
"include": [
"src/**/*"
]
}

179
modeler/mock/behavior.ts Normal file
View File

@@ -0,0 +1,179 @@
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2025 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import {MockMethod} from 'vite-plugin-mock';
import {createResponse} from './core';
const statusOption = {
type: 'select',
defaults: 0,
name: 'status',
tips: '状态',
options: [
{
name: '默认',
value: 'default',
},
{
name: '运行中',
value: 'running',
color: 'blue',
},
{
name: '已完成',
value: 'finished',
color: 'teal'
},
{
name: '错误',
value: 'error',
color: 'red',
},
]
}
const behaviors = [
{
id: 'behavior_001',
name: '行为树1',
desc: '行为树1说明',
status: null,
options: {},
// data: [
// {
// id: '5a0c4b08-0b02-44f3-8918-79c6f9ab22fa',
// type: 'startEvent',
// name: '开始',
// description: '',
// width: 160,
// height: 40,
// position: {
// x: 460,
// y: 120,
// },
// data: {
// status: 'default',
// }
// },
// {
// id: 'ec8741db-9580-44ab-8a58-8c731bf1faad',
// type: 'sequenceFlow',
// name: null,
// description: null,
// source: '5a0c4b08-0b02-44f3-8918-79c6f9ab22fa',
// target: '7422aefc-7781-457a-b910-783f73ac0ac5',
// data: {
// status: 'default',
// }
// },
// {
// id: '7422aefc-7781-457a-b910-783f73ac0ac5',
// type: 'task',
// name: '任务',
// description: '',
// width: 160,
// height: 40,
// position: {
// x: 460,
// y: 120,
// },
// data: {
// status: 'default',
// }
// },
// ]
}
]
const definitions = [
{
type: 'sequenceFlow',
label: null,
options: [
{
type: 'input',
defaults: null,
name: 'label',
}
]
},
{
type: 'startEvent',
label: '开始',
desc: '行为树的开始节点,每个行为树仅允许一个开始节点',
options: [
statusOption
]
},
{
type: 'task',
label: '任务节点',
desc: '执行特定任务',
options: [
statusOption,
{
type: 'number',
defaults: 0,
name: 'counter',
tips: '统计数量'
}
]
},
{
type: 'parallelGateway',
label: '并行网关',
desc: '并行执行子节点',
options: [
statusOption,
{
type: 'number',
defaults: 0,
name: 'counter',
tips: '统计数量'
}
]
},
{
type: 'exclusiveGateway',
label: '排他网关',
desc: '选择满足条件的一个子节点执行',
options: [
statusOption,
{
type: 'number',
defaults: 0,
name: 'counter',
tips: '统计数量'
}
]
}
]
export default [
{
url: '/api/behavior/trees',
method: 'get',
response: () => {
return createResponse(behaviors)
},
},
{
url: '/api/behavior/trees',
method: 'post',
response: ({body}) => {
let value = behaviors.filter((b) => b.id == body?.id)
if (value && value.length > 0) {
value[0] = Object.assign(value[0], body)
} else {
behaviors.push(body)
}
return createResponse(behaviors)
},
},
] as MockMethod[];

16
modeler/mock/core.ts Normal file
View File

@@ -0,0 +1,16 @@
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2025 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
export const createResponse = (result: any,success: boolean = true, message: String = null)=> {
return {
success: success,
message: message,
result: result,
}
}

61
modeler/mock/files.ts Normal file
View File

@@ -0,0 +1,61 @@
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2025 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import {MockMethod} from 'vite-plugin-mock';
import {createResponse} from './core';
export default [
{
url: '/api/finder/browser',
method: 'post',
response: () => {
return {
success: true,
message: null,
data: [
{
name: 'home',
directory: true,
path: '/home',
children: [
{
name: 'users',
directory: true,
path: '/users',
},
]
},
{
name: 'usr',
directory: true,
path: '/usr',
children: [
{
name: 'opt',
directory: true,
path: '/opt',
},
]
},
{
name: 'var',
directory: true,
path: '/var',
children: [
{
name: 'lib',
directory: true,
path: '/lib',
},
]
}
],
}
}
},
] as MockMethod[];

22
modeler/mock/samples.ts Normal file
View File

@@ -0,0 +1,22 @@
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2025 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import {MockMethod} from 'vite-plugin-mock';
import {createResponse} from './core';
export default [
{
url: '/api/samples',
method: 'get',
response: () => {
return createResponse( {
name: 'vben',
})
},
},
] as MockMethod[];

6315
modeler/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

47
modeler/package.json Normal file
View File

@@ -0,0 +1,47 @@
{
"name": "modeler",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vue-tsc -b && vite build",
"preview": "vite preview"
},
"dependencies": {
"@antv/x6": "^3.1.2",
"@antv/x6-vue-shape": "^3.0.2",
"ant-design-vue": "^4.2.6",
"axios": "^1.13.2",
"echarts": "^6.0.0",
"js-cookie": "^3.0.5",
"pinia": "^3.0.4",
"vue": "^3.5.24",
"vue-draggable-next": "^2.3.0",
"vue-router": "^4.6.4",
"vuedraggable": "^2.24.3"
},
"devDependencies": {
"@originjs/vite-plugin-commonjs": "^1.0.3",
"@tailwindcss/postcss": "^4.1.18",
"@tailwindcss/vite": "^4.1.18",
"@types/js-cookie": "^3.0.6",
"@types/node": "^24.10.1",
"@vitejs/plugin-vue": "^6.0.3",
"@vitejs/plugin-vue-jsx": "^5.1.2",
"@vue/tsconfig": "^0.8.1",
"autoprefixer": "^10.4.22",
"less": "^4.4.2",
"mockjs": "^1.1.0",
"postcss-selector-parser": "^7.1.1",
"tailwindcss": "^4.1.18",
"typescript": "~5.9.3",
"unplugin-auto-import": "^20.3.0",
"unplugin-vue-components": "^30.0.0",
"vite": "^7.2.4",
"vite-plugin-dts": "^4.5.4",
"vite-plugin-mock": "^3.0.2",
"vitest": "^4.0.15",
"vue-tsc": "^3.1.4"
}
}

15
modeler/postcss.config.js Normal file
View File

@@ -0,0 +1,15 @@
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2025 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
export default {
plugins: {
'@tailwindcss/postcss': {},
autoprefixer: {},
},
}

View File

@@ -0,0 +1,28 @@
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2025 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
module.exports = {
"printWidth": 200,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"vueIndentScriptAndStyle": true,
"singleQuote": true,
"quoteProps": "as-needed",
"bracketSpacing": true,
"trailingComma": "es5",
"jsxBracketSameLine": true,
"jsxSingleQuote": false,
"arrowParens": "always",
"insertPragma": false,
"requirePragma": false,
"proseWrap": "preserve",
"htmlWhitespaceSensitivity": "strict",
"endOfLine": "lf"
};

27
modeler/src/api/user.ts Normal file
View File

@@ -0,0 +1,27 @@
/*
* This file is part of the kernelstudio package.
*
* (c) 2014-2025 zlin <admin@kernelstudio.com>
*
* For the full copyright and license information, please view the LICENSE file
* that was distributed with this source code.
*/
import request, { HttpRequestClient } from '@/utils/request';
import type { BasicResponse, UserLoginForm, UserLoginResult, UserSessionResult } from '@/types';
const req = new HttpRequestClient(HttpRequestClient.build({
baseURL: '/',
}));
export const fetchUserSession = (): Promise<UserSessionResult> => {
return req.get<UserSessionResult>('/getInfo');
};
export const signinByForm = (form: UserLoginForm): Promise<UserLoginResult> => {
return req.postJson<UserLoginResult>('/login', form);
};
export const logoutSession = (): Promise<BasicResponse> => {
return request.post<BasicResponse>('/logout');
};

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1768461123253" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10989" width="200" height="200">
<path
d="M684.6425 277.598412l-1.436722-1.467421c-12.489452-12.461823-32.730449-12.461823-45.159526 0L479.700875 434.510138l-158.286026-158.315702c-12.555967-12.524245-32.793894-12.524245-45.225017 0-12.555967 12.462846-12.555967 32.701796 0 45.223994l158.348448 158.317749L276.129456 638.049834c-12.495592 12.429077-12.495592 32.671097 0 45.163619l1.49812 1.434675c12.429077 12.494569 32.66905 12.494569 45.221948 0l158.287049-158.286026 158.283979 158.286026c12.491499 12.494569 32.731472 12.494569 45.220924 0 12.495592-12.493545 12.495592-32.731472 0-45.222971l-158.285003-158.285003 158.285003-158.314679C697.138092 310.299185 697.138092 290.060235 684.6425 277.598412"
p-id="10990" fill="#bfbfbf" ></path>
<path
d="M818.881854 140.522454c-187.332573-187.363272-491.033479-187.363272-678.364005 0-187.329503 187.329503-187.329503 491.032456 0 678.362982 187.330526 187.392948 491.031433 187.392948 678.364005 0C1006.274802 631.55491 1006.274802 327.851956 818.881854 140.522454M773.656837 773.660418c-162.344458 162.343435-425.569512 162.407903-587.914994 0-162.40688-162.344458-162.40688-425.602258 0-587.914994 162.344458-162.40688 425.569512-162.40688 587.914994 0C936.063717 348.059184 936.000272 611.31596 773.656837 773.660418"
p-id="10991" fill="#bfbfbf" ></path>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1768462375141" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6349" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M574.80892 387.211982a41.605544 41.605544 0 0 0-4.738568-8.012071 38.572403 38.572403 0 0 0-7.290986-7.359661 42.853138 42.853138 0 0 0-4.360856-2.884345 40.85012 40.85012 0 0 0-4.578327-2.174706c-0.743978-0.297591-1.487956-0.560845-2.289163-0.824098a21.575365 21.575365 0 0 0-2.209043-0.663858c-1.384944-0.343375-2.8729-0.698195-4.200614-0.904219s-2.586755-0.320483-3.880132-0.423496-2.289163-0.057229-3.433745 0-2.174705 0.091567-3.204829 0.171688l-1.53374 0.148795-0.766869 0.080121-0.675303 0.114458c-1.796993 0.297591-3.696999 0.606628-5.230739 1.030124l-2.415067 0.618074-2.186151 0.698195-2.174705 0.70964-1.980127 0.76687-1.980126 0.778316-1.842776 0.812653c-2.495188 1.087353-4.715677 2.289163-6.970503 3.433745s-4.315073 2.369284-6.295199 3.605432c-1.007232 0.618074-2.037355 1.213257-3.01025 1.842776l-2.895792 1.911452c-1.957235 1.247594-3.742782 2.575309-5.60845 3.85724s-3.593986 2.621092-5.390979 3.937361-3.433745 2.689767-5.196401 4.040373c-3.433745 2.712659-6.753032 5.448209-9.980753 8.26388q-9.774728 8.378338-18.816922 17.168725c-12.098228 11.720516-23.544045 23.875974-34.486246 36.489264s-21.518136 25.478388-31.327201 39.09891c14.879562-7.863276 29.163941-16.184385 43.425429-24.402481s28.408517-16.424747 42.509764-24.230794a777.388431 777.388431 0 0 1 21.060302-11.365696q5.265076-2.712659 10.461477-5.265076c3.433745-1.671089 6.947611-3.273504 10.358464-4.795797 2.460851-1.064461 4.933147-2.094584 7.336769-3.021696-1.087353 2.998804-2.357838 6.123512-3.674107 9.316895-2.746996 6.672911-5.974716 13.51751-9.271112 20.453675-1.659643 3.433745-3.433745 6.947611-5.150618 10.438585s-3.433745 7.00484-5.299413 10.518705c-14.433175 28.122372-29.919365 56.668239-44.856156 85.843626s-29.575991 58.842944-42.532655 90.181591c-3.239166 7.840385-6.363874 15.806673-9.282557 23.96754s-5.722908 16.516314-8.160868 25.180797c-1.25904 4.360856-2.369284 8.824725-3.433745 13.437389s-1.957235 9.38557-2.643984 14.433175a118.784687 118.784687 0 0 0-1.144581 16.436193 73.653831 73.653831 0 0 0 0.62952 9.671715 60.914637 60.914637 0 0 0 2.575308 11.319913 46.927849 46.927849 0 0 0 6.684357 13.002448 41.136266 41.136266 0 0 0 12.418712 11.148225 42.349522 42.349522 0 0 0 14.055463 5.093389 50.647739 50.647739 0 0 0 11.777745 0.606628 59.667043 59.667043 0 0 0 9.545811-1.396389 75.782753 75.782753 0 0 0 8.137976-2.289164 108.449114 108.449114 0 0 0 13.918113-5.722908c4.292181-2.094584 8.332555-4.315073 12.212687-6.65002s7.611468-4.704231 11.228346-7.187973c7.268094-4.921701 14.124138-10.106656 20.762712-15.451852a470.2056 470.2056 0 0 0 37.462158-33.868172 480.30081 480.30081 0 0 0 33.742268-37.107338c-15.280165 6.959057-30.102498 14.341608-44.867602 21.529581s-29.438641 14.238596-44.032057 20.694037c-7.290985 3.22772-14.559079 6.283753-21.747052 9.019303-3.593986 1.350606-7.153635 2.666875-10.667501 3.811457s-6.993394 2.174705-10.301235 3.021696c-2.540971 0.640966-5.024714 1.144582-7.313877 1.499402 0.377712-1.842777 0.927111-4.006036 1.568077-6.226524a193.434304 193.434304 0 0 1 6.86749-19.389214c2.758442-6.775924 5.906041-13.73498 9.156653-20.60247 1.625306-3.433745 3.330733-6.970502 5.024714-10.484368s3.433745-7.027732 5.184955-10.541598c14.124138-28.202493 29.404303-56.702576 44.249528-85.752059s29.564545-58.57969 42.761571-89.723758q2.472296-5.860258 4.875918-11.800637t4.578327-12.052445c3.056033-8.12653 5.848812-16.481976 8.435567-25.272364 1.281931-4.395194 2.437959-8.939183 3.50242-13.73498a135.93052 135.93052 0 0 0 2.586754-15.303057c0.309037-2.746996 0.515062-5.722908 0.572291-8.8934a69.71647 69.71647 0 0 0-0.583736-10.610272 49.537495 49.537495 0 0 0-3.754228-13.815101zM433.819348 741.860616a8.859062 8.859062 0 0 1-2.643983-0.320483c-0.583737-0.171687-0.789761-0.412049-0.41205-0.515062a5.024714 5.024714 0 0 1 2.724105 0.606629l0.423495 0.228916z m101.684637-325.393126a7.14219 7.14219 0 0 1-1.224703-0.171687l-0.606628-0.148796a8.321109 8.321109 0 0 1 3.159046 0c0.194579 0.125904 0.103012 0.377712-1.327715 0.320483z" p-id="6350" fill="#cdcdcd"></path><path d="M590.932545 281.909005m-35.004018 35.004019a49.503158 49.503158 0 1 0 70.008037-70.008037 49.503158 49.503158 0 1 0-70.008037 70.008037Z" p-id="6351" fill="#cdcdcd"></path><path d="M511.971385 0C229.259711 0 0 229.259711 0 511.971385s229.259711 512.028615 511.971385 512.028615S1024 794.774627 1024 511.971385 794.774627 0 511.971385 0z m313.512368 825.483753a441.739854 441.739854 0 1 1 95.00028-140.943788 441.808528 441.808528 0 0 1-95.00028 140.943788z" p-id="6352" fill="#cdcdcd"></path></svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1768461553746" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16917" id="mx_n_1768461553747" width="200" height="200">
<path d="M413.866667 320c-17.066667 0-32 14.933333-32 32v320c0 17.066667 14.933333 32 32 32s32-14.933333 32-32v-320c0-17.066667-14.933333-32-32-32zM605.866667 320c-17.066667 0-32 14.933333-32 32v320c0 17.066667 14.933333 32 32 32s32-14.933333 32-32v-320c0-17.066667-14.933333-32-32-32z"
fill="#bfbfbf" p-id="16918"></path>
<path d="M509.866667 32C245.333333 32 32 247.466667 32 512s213.333333 480 477.866667 480S987.733333 776.533333 987.733333 512 774.4 32 509.866667 32z m0 896C281.6 928 96 742.4 96 512S281.6 96 509.866667 96 923.733333 281.6 923.733333 512s-185.6 416-413.866666 416z" fill="#bfbfbf"
p-id="16919"></path>
</svg>

After

Width:  |  Height:  |  Size: 959 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1768462226296" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4699" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M429.504 309.952c-12.928-13.056-39.104-4.224-39.104 17.344v380.672c0 17.344 21.76 30.528 39.104 17.344l191.104-176.256a42.24 42.24 0 0 0 0-60.928l-191.104-178.176z" fill="#cdcdcd" p-id="4700"></path><path d="M1015.552 512.128a502.656 502.656 0 0 0-503.68-503.68 502.208 502.208 0 0 0-356.096 147.264 502.016 502.016 0 0 0-147.328 356.416 500.288 500.288 0 0 0 146.816 356.736 499.584 499.584 0 0 0 356.544 146.688c277.312-2.816 503.744-226.24 503.744-503.424z m-947.968 0a444.288 444.288 0 0 1 444.288-444.544c246.976 0 447.296 200.128 447.296 444.544 0 244.032-200.32 444.416-447.296 444.416a442.304 442.304 0 0 1-444.288-444.416z" fill="#cdcdcd" p-id="4701"></path></svg>

After

Width:  |  Height:  |  Size: 1006 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1766669849970" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1663" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M37.333333 670.933333l179.626667-179.626666v154.88h53.973333V363.093333L36.48 597.333333l0.853333 73.6zM474.88 468.266667h-137.386667v-12.373334c0 4.053333 147.626667 0 147.626667 0l54.826667-54.826666H293.76V661.333333l44.373333-42.24v-102.4H426.666667l48.426666-48.426666z" fill="#0253BE" p-id="1664"></path><path d="M355.626667 536.32v47.146667l53.76-47.146667h-53.76zM493.44 517.12v-49.066667l-56.746667 49.066667h56.746667z" fill="#0253BE" p-id="1665"></path><path d="M588.8 452.266667h101.12l48.426667-50.986667h-174.72l-50.346667 47.36v68.48h128.853333v8.96l-13.44 10.24h-196.266666l-51.626667 45.653333H650.666667l48.853333-36.48v-77.44h-126.72l16-15.786666z" fill="#0253BE" p-id="1666"></path><path d="M718.933333 621.226667l51.413334-51.626667 0.853333-175.146667-52.266667 52.48v174.293334zM881.28 467.84l-91.306667-91.306667v247.253334l52.48-46.933334v-84.266666l45.013334 47.573333 47.36-51.2v106.026667l43.306666 43.306666V370.986667l-96.853333 96.853333z" fill="#0253BE" p-id="1667"></path><path d="M272.426667 722.986667v-51.626667H196.906667v-131.2L18.133333 722.986667v-137.6l1.493334-1.493334 273.706666-272.853333v65.28h474.88v-43.306667l113.066667 97.92 121.6-98.56V706.133333l-92.8-93.013333v-72.746667l-21.12 27.733334-29.226667-29.226667v51.626667l-91.306666 91.52v-82.773334l-72.96 73.173334v-99.413334l-35.2 35.413334H362.24v24.32l-90.026667 90.24z m-64.853334-62.293334h75.52v36.48l68.693334-68.906666v-30.506667h304.213333l50.346667-50.56v99.626667l72.96-73.173334v82.773334l69.973333-70.186667v-72.96l38.826667 38.826667 32.853333-43.52v100.053333l71.466667 71.68V354.56l-111.146667 90.026667-102.186667-88.533334v30.72H282.666667v-50.346666L28.8 589.866667v107.093333l178.773333-182.826667v146.56z" fill="#606060" opacity=".55" p-id="1668"></path></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1769506253911" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1989" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M795.02336 141.85472a25.6 25.6 0 0 0-35.15392-8.6528L213.35552 463.81568a56.32 56.32 0 0 0-19.03616 19.03616c-16.1024 26.61376-7.5776 61.24032 19.03616 77.34272l546.51392 330.60864a25.6 25.6 0 0 0 38.85056-21.90336V155.10528a25.6 25.6 0 0 0-3.69664-13.25056zM849.92 868.89984c0 42.4192-34.38592 76.8-76.8 76.8a76.8 76.8 0 0 1-39.75168-11.0848L186.8544 604.00128c-50.81088-30.73536-67.08224-96.8448-36.34688-147.65056a107.52 107.52 0 0 1 36.34688-36.34176l546.5088-330.61376c36.3008-21.95456 83.51232-10.33216 105.472 25.9584A76.8 76.8 0 0 1 849.92 155.10528v713.79456z" fill="#1296db" p-id="1990"></path></svg>

After

Width:  |  Height:  |  Size: 943 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1769564948327" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2558" width="200" height="200">
<path d="M768.5 567.1l-352 207.8c-10.4 6.2-21.6 9-32.4 9-33.4 0-64.1-26.7-64.1-64.1V304.2c0-37.4 30.7-64.1 64.1-64.1 10.8 0 22 2.8 32.4 9l351.9 207.8c42 24.8 42 85.4 0.1 110.2z" p-id="2559" fill="#5da0df"></path>
</svg>

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1766719692225" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16285" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M789.12 818.016s-5.632 14.496-13.12 0c0 0-83.808-252.896-288.064-189.216v78.496s-3.264 46.144-43.52 16.096L243.584 550.016s-42.592-23.168 2.592-54.88l202.976-174.4s30.528-21.76 37.856 13.92l0.224 84.704c0 0.064 380.704 18.304 301.888 398.656z" p-id="16286" fill="#7ae8fc"></path></svg>

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Some files were not shown because too many files have changed in this diff Show More