This commit is contained in:
2025-10-17 10:31:13 +08:00
commit e6e86f2ce0
1043 changed files with 1031839 additions and 0 deletions

12
.editorconfig Normal file
View File

@@ -0,0 +1,12 @@
root = true
[*.{js,ts,vue}]
charset = utf-8 # 设置文件字符集为 utf-8
end_of_line = lf # 控制换行类型(lf | cr | crlf)
insert_final_newline = true # 始终在文件末尾插入一个新行
indent_style = space # 缩进风格tab | space
indent_size = 2 # 缩进大小
max_line_length = 100 # 最大行长度
[*.md] # 仅 md 文件适用以下规则
max_line_length = off # 关闭最大行长度限制
trim_trailing_whitespace = false # 关闭末尾空格修剪

20
.env Normal file
View File

@@ -0,0 +1,20 @@
# 标题
VITE_APP_TITLE=CSCN综合监控
# 项目本地运行端口号
VITE_PORT=5000
# open 运行 npm run dev 时自动打开浏览器
VITE_OPEN=true
# 租户开关
VITE_APP_TENANT_ENABLE=true
# 验证码的开关
VITE_APP_CAPTCHA_ENABLE=true
# 文档地址的开关
VITE_APP_DOCALERT_ENABLE=true
# 百度统计 close by yang chen jj on 2025.09.29
VITE_APP_BAIDU_CODE=

38
.env.dev Normal file
View File

@@ -0,0 +1,38 @@
# 开发环境本地只启动前端项目依赖开发环境后端、APP
VITE_NODE_ENV=development
VITE_DEV=true
# 请求路径 注:/api 正常不需要 当前是访问演示环境nginx转发用
VITE_BASE_URL='https://demo.jeelowcode.com/api'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server
# 接口地址
VITE_API_URL=/admin-api
# 是否删除debugger
VITE_DROP_DEBUGGER=false
# 是否删除console.log
VITE_DROP_CONSOLE=false
# 是否sourcemap
VITE_SOURCEMAP=true
# 打包路径
VITE_BASE_PATH=/
# 输出路径
VITE_OUT_DIR=dist
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=true
# 验证码的开关
VITE_APP_CAPTCHA_ENABLE=false
# 登录用户名和密码
VITE_LOGIN_USERNAME=admin
VITE_LOGIN_PASSWORD=admin123

46
.env.office Normal file
View File

@@ -0,0 +1,46 @@
# 生产环境:只在打包时使用
VITE_NODE_ENV=production
VITE_DEV=false
# 项目本地运行端口号
VITE_PORT=80
# 请求路径
VITE_BASE_URL='https://xops.chinasatnet.com.cn'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server
# 接口地址
VITE_API_URL=/admin-api
# 是否删除debugger
VITE_DROP_DEBUGGER=true
# 是否删除console.log
VITE_DROP_CONSOLE=true
# 是否sourcemap
VITE_SOURCEMAP=false
# 打包路径
VITE_BASE_PATH=/
# 输出路径
VITE_OUT_DIR=dist-office
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
# 演示登录账号
VITE_LOGIN_USERNAME=
# 演示登录密码
VITE_LOGIN_PASSWORD=
#默认单点登陆
VITE_DEFAULT_SSO=true
# 门户地址
VITE_PORTAL_BASE_URL=https://mis.chinasatnet.com.cn

45
.env.prod Normal file
View File

@@ -0,0 +1,45 @@
# 生产环境:只在打包时使用
VITE_NODE_ENV=production
VITE_DEV=false
# 请求路径
# 设备网地址10.0.64.25:48080
# 办公网地址10.64.34.240:48080
VITE_BASE_URL='http://10.0.64.25:48080'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server
# 接口地址
VITE_API_URL=/admin-api
# 是否删除debugger
VITE_DROP_DEBUGGER=true
# 是否删除console.log
VITE_DROP_CONSOLE=true
# 是否sourcemap
VITE_SOURCEMAP=false
# 打包路径
VITE_BASE_PATH=/
# 输出路径
VITE_OUT_DIR=dist-prod
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
# 演示登录账号
VITE_LOGIN_USERNAME=
# 演示登录密码
VITE_LOGIN_PASSWORD=
#默认单点登陆
VITE_DEFAULT_SSO=false

35
.env.stage Normal file
View File

@@ -0,0 +1,35 @@
# 预发布环境:只在打包时使用
VITE_NODE_ENV=production
VITE_DEV=false
# 请求路径
VITE_BASE_URL='/api'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server
# 接口地址
VITE_API_URL=/admin-api
# 是否删除debugger
VITE_DROP_DEBUGGER=true
# 是否删除console.log
VITE_DROP_CONSOLE=true
# 是否sourcemap
VITE_SOURCEMAP=false
# 打包路径
VITE_BASE_PATH='/'
# 输出路径
VITE_OUT_DIR=dist-stage
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
# 登录用户名和密码
VITE_LOGIN_USERNAME=admin
VITE_LOGIN_PASSWORD=admin123

50
.env.test Normal file
View File

@@ -0,0 +1,50 @@
# 生产环境:只在打包时使用
VITE_NODE_ENV=development
VITE_DEV=true
# 项目本地运行端口号
VITE_PORT=80
# 请求路径
VITE_BASE_URL='https://test.xops.chinasatnet.com.cn'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server
# 接口地址
VITE_API_URL=/admin-api
# 是否删除debugger
VITE_DROP_DEBUGGER=true
# 是否删除console.log
VITE_DROP_CONSOLE=true
# 是否sourcemap
VITE_SOURCEMAP=false
# 打包路径
VITE_BASE_PATH=/
# 输出路径
VITE_OUT_DIR=dist-test
# 是否隐藏全局设置按钮
VITE_HIDE_GLOBAL_SETTING=false
# 演示登录账号
VITE_LOGIN_USERNAME=
# 演示登录密码
VITE_LOGIN_PASSWORD=
#默认单点登陆
VITE_DEFAULT_SSO=true
# 门户地址
VITE_PORTAL_BASE_URL=https://zhbg-test.chinasatnet.com.cn
# 登录用户名和密码
VITE_LOGIN_USERNAME=admin
VITE_LOGIN_PASSWORD=admin123

8
.eslintignore Normal file
View File

@@ -0,0 +1,8 @@
/build/
/config/
/dist/
/*.js
/test/unit/coverage/
/node_modules/*
/dist*
/src/main.ts

259
.eslintrc-auto-import.json Normal file
View File

@@ -0,0 +1,259 @@
{
"globals": {
"EffectScope": true,
"ElMessage": true,
"ElMessageBox": true,
"ElTag": true,
"asyncComputed": true,
"autoResetRef": true,
"computed": true,
"computedAsync": true,
"computedEager": true,
"computedInject": true,
"computedWithControl": true,
"controlledComputed": true,
"controlledRef": true,
"createApp": true,
"createEventHook": true,
"createGlobalState": true,
"createInjectionState": true,
"createReactiveFn": true,
"createSharedComposable": true,
"createUnrefFn": true,
"customRef": true,
"debouncedRef": true,
"debouncedWatch": true,
"defineAsyncComponent": true,
"defineComponent": true,
"eagerComputed": true,
"effectScope": true,
"extendRef": true,
"getCurrentInstance": true,
"getCurrentScope": true,
"h": true,
"ignorableWatch": true,
"inject": true,
"isDefined": true,
"isProxy": true,
"isReactive": true,
"isReadonly": true,
"isRef": true,
"makeDestructurable": true,
"markRaw": true,
"nextTick": true,
"onActivated": true,
"onBeforeMount": true,
"onBeforeUnmount": true,
"onBeforeUpdate": true,
"onClickOutside": true,
"onDeactivated": true,
"onErrorCaptured": true,
"onKeyStroke": true,
"onLongPress": true,
"onMounted": true,
"onRenderTracked": true,
"onRenderTriggered": true,
"onScopeDispose": true,
"onServerPrefetch": true,
"onStartTyping": true,
"onUnmounted": true,
"onUpdated": true,
"pausableWatch": true,
"provide": true,
"reactify": true,
"reactifyObject": true,
"reactive": true,
"reactiveComputed": true,
"reactiveOmit": true,
"reactivePick": true,
"readonly": true,
"ref": true,
"refAutoReset": true,
"refDebounced": true,
"refDefault": true,
"refThrottled": true,
"refWithControl": true,
"resolveComponent": true,
"resolveRef": true,
"resolveUnref": true,
"shallowReactive": true,
"shallowReadonly": true,
"shallowRef": true,
"syncRef": true,
"syncRefs": true,
"templateRef": true,
"throttledRef": true,
"throttledWatch": true,
"toRaw": true,
"toReactive": true,
"toRef": true,
"toRefs": true,
"triggerRef": true,
"tryOnBeforeMount": true,
"tryOnBeforeUnmount": true,
"tryOnMounted": true,
"tryOnScopeDispose": true,
"tryOnUnmounted": true,
"unref": true,
"unrefElement": true,
"until": true,
"useActiveElement": true,
"useArrayEvery": true,
"useArrayFilter": true,
"useArrayFind": true,
"useArrayFindIndex": true,
"useArrayJoin": true,
"useArrayMap": true,
"useArrayReduce": true,
"useArraySome": true,
"useAsyncQueue": true,
"useAsyncState": true,
"useAttrs": true,
"useBase64": true,
"useBattery": true,
"useBluetooth": true,
"useBreakpoints": true,
"useBroadcastChannel": true,
"useBrowserLocation": true,
"useCached": true,
"useClipboard": true,
"useColorMode": true,
"useConfirmDialog": true,
"useCounter": true,
"useCssModule": true,
"useCssVar": true,
"useCssVars": true,
"useCurrentElement": true,
"useCycleList": true,
"useDark": true,
"useDateFormat": true,
"useDebounce": true,
"useDebounceFn": true,
"useDebouncedRefHistory": true,
"useDeviceMotion": true,
"useDeviceOrientation": true,
"useDevicePixelRatio": true,
"useDevicesList": true,
"useDisplayMedia": true,
"useDocumentVisibility": true,
"useDraggable": true,
"useDropZone": true,
"useElementBounding": true,
"useElementByPoint": true,
"useElementHover": true,
"useElementSize": true,
"useElementVisibility": true,
"useEventBus": true,
"useEventListener": true,
"useEventSource": true,
"useEyeDropper": true,
"useFavicon": true,
"useFetch": true,
"useFileDialog": true,
"useFileSystemAccess": true,
"useFocus": true,
"useFocusWithin": true,
"useFps": true,
"useFullscreen": true,
"useGamepad": true,
"useGeolocation": true,
"useIdle": true,
"useImage": true,
"useInfiniteScroll": true,
"useIntersectionObserver": true,
"useInterval": true,
"useIntervalFn": true,
"useKeyModifier": true,
"useLastChanged": true,
"useLocalStorage": true,
"useMagicKeys": true,
"useManualRefHistory": true,
"useMediaControls": true,
"useMediaQuery": true,
"useMemoize": true,
"useMemory": true,
"useMounted": true,
"useMouse": true,
"useMouseInElement": true,
"useMousePressed": true,
"useMutationObserver": true,
"useNavigatorLanguage": true,
"useNetwork": true,
"useNow": true,
"useObjectUrl": true,
"useOffsetPagination": true,
"useOnline": true,
"usePageLeave": true,
"useParallax": true,
"usePermission": true,
"usePointer": true,
"usePointerSwipe": true,
"usePreferredColorScheme": true,
"usePreferredDark": true,
"usePreferredLanguages": true,
"useRafFn": true,
"useRefHistory": true,
"useResizeObserver": true,
"useRoute": true,
"useRouter": true,
"useScreenOrientation": true,
"useScreenSafeArea": true,
"useScriptTag": true,
"useScroll": true,
"useScrollLock": true,
"useSessionStorage": true,
"useShare": true,
"useSlots": true,
"useSpeechRecognition": true,
"useSpeechSynthesis": true,
"useStepper": true,
"useStorage": true,
"useStorageAsync": true,
"useStyleTag": true,
"useSupported": true,
"useSwipe": true,
"useTemplateRefsList": true,
"useTextDirection": true,
"useTextSelection": true,
"useTextareaAutosize": true,
"useThrottle": true,
"useThrottleFn": true,
"useThrottledRefHistory": true,
"useTimeAgo": true,
"useTimeout": true,
"useTimeoutFn": true,
"useTimeoutPoll": true,
"useTimestamp": true,
"useTitle": true,
"useToggle": true,
"useTransition": true,
"useUrlSearchParams": true,
"useUserMedia": true,
"useVModel": true,
"useVModels": true,
"useVibrate": true,
"useVirtualList": true,
"useWakeLock": true,
"useWebNotification": true,
"useWebSocket": true,
"useWebWorker": true,
"useWebWorkerFn": true,
"useWindowFocus": true,
"useWindowScroll": true,
"useWindowSize": true,
"watch": true,
"watchArray": true,
"watchAtMost": true,
"watchDebounced": true,
"watchEffect": true,
"watchIgnorable": true,
"watchOnce": true,
"watchPausable": true,
"watchPostEffect": true,
"watchSyncEffect": true,
"watchThrottled": true,
"watchTriggerable": true,
"watchWithFilter": true,
"whenever": true
}
}

74
.eslintrc.js Normal file
View File

@@ -0,0 +1,74 @@
// @ts-check
const { defineConfig } = require('eslint-define-config')
module.exports = defineConfig({
root: true,
env: {
browser: true,
node: true,
es6: true
},
parser: 'vue-eslint-parser',
parserOptions: {
parser: '@typescript-eslint/parser',
ecmaVersion: 2020,
sourceType: 'module',
jsxPragma: 'React',
ecmaFeatures: {
jsx: true
}
},
extends: [
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
'plugin:prettier/recommended',
'@unocss'
],
rules: {
'vue/no-setup-props-destructure': 'off',
'vue/script-setup-uses-vars': 'error',
'vue/no-reserved-component-names': 'off',
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-empty-function': 'off',
'vue/custom-event-name-casing': 'off',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'no-unused-vars': 'off',
'space-before-function-paren': 'off',
'vue/attributes-order': 'off',
'vue/one-component-per-file': 'off',
'vue/html-closing-bracket-newline': 'off',
'vue/max-attributes-per-line': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/attribute-hyphenation': 'off',
'vue/require-default-prop': 'off',
'vue/require-explicit-emits': 'off',
'vue/require-toggle-inside-transition': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always',
normal: 'never',
component: 'any'
},
svg: 'always',
math: 'always'
}
],
'vue/multi-word-component-names': 'off',
'vue/no-v-html': 'off',
'prettier/prettier': 'off',
'@unocss/order': 'off',
'@unocss/order-attributify': 'off'
}
})

11
.gitignore vendored Normal file
View File

@@ -0,0 +1,11 @@
node_modules
.DS_Store
dist
dist-ssr
*.local
/dist*
*-lock.*
pnpm-debug
auto-*.d.ts
.idea
.history

11
.prettierignore Normal file
View File

@@ -0,0 +1,11 @@
/node_modules/**
/dist/
/dist*
/public/*
/docs/*
/vite.config.ts
/src/types/env.d.ts
/src/types/auto-components.d.ts
/src/types/auto-imports.d.ts
/docs/**/*
CHANGELOG

6
.stylelintignore Normal file
View File

@@ -0,0 +1,6 @@
/dist/*
/public/*
public/*
/dist*
/src/types/env.d.ts
/docs/**/*

View File

@@ -0,0 +1,6 @@
{
"ExpandedNodes": [
""
],
"PreviewInSolutionExplorer": false
}

File diff suppressed because it is too large Load Diff

BIN
.vs/frontend/v17/.wsuo Normal file

Binary file not shown.

View File

@@ -0,0 +1,12 @@
{
"Version": 1,
"WorkspaceRootPath": "E:\\SourceCode\\frontend\\",
"Documents": [],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": []
}
]
}

Binary file not shown.

BIN
.vs/slnx.sqlite Normal file

Binary file not shown.

19
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,19 @@
{
"recommendations": [
"christian-kohler.path-intellisense",
"vscode-icons-team.vscode-icons",
"davidanson.vscode-markdownlint",
"stylelint.vscode-stylelint",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"mrmlnc.vscode-less",
"lokalise.i18n-ally",
"redhat.vscode-yaml",
"csstools.postcss",
"mikestead.dotenv",
"eamodio.gitlens",
"antfu.iconify",
"antfu.unocss",
"Vue.volar"
]
}

16
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "msedge",
"request": "launch",
"name": "jeelowcode",
"url": "http://localhost:81",
"webRoot": "${workspaceFolder}/src",
"sourceMaps": true
}
]
}

145
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,145 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"npm.packageManager": "pnpm",
"editor.tabSize": 2,
"prettier.printWidth": 100, // 超过最大值换行
"editor.defaultFormatter": "esbenp.prettier-vscode",
"files.eol": "\n",
"search.exclude": {
"**/node_modules": true,
"**/*.log": true,
"**/*.log*": true,
"**/bower_components": true,
"**/dist": true,
"**/elehukouben": true,
"**/.git": true,
"**/.gitignore": true,
"**/.svn": true,
"**/.DS_Store": true,
"**/.idea": true,
"**/.vscode": false,
"**/yarn.lock": true,
"**/tmp": true,
"out": true,
"dist": true,
"node_modules": true,
"CHANGELOG.md": true,
"examples": true,
"res": true,
"screenshots": true,
"yarn-error.log": true,
"**/.yarn": true
},
"files.exclude": {
"**/.cache": true,
"**/.editorconfig": true,
"**/.eslintcache": true,
"**/bower_components": true,
"**/.idea": true,
"**/tmp": true,
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true
},
"files.watcherExclude": {
"**/.git/objects/**": true,
"**/.git/subtree-cache/**": true,
"**/.vscode/**": true,
"**/node_modules/**": true,
"**/tmp/**": true,
"**/bower_components/**": true,
"**/dist/**": true,
"**/yarn.lock": true
},
"stylelint.enable": true,
"stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],
"path-intellisense.mappings": {
"@/": "${workspaceRoot}/src"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
"[typescriptreact]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[css]": {
"editor.defaultFormatter": "rvest.vs-code-prettier-eslint"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.fixAll.stylelint": "explicit"
},
"[vue]": {
"editor.defaultFormatter": "Vue.volar"
},
"i18n-ally.localesPaths": ["src/locales"],
"i18n-ally.keystyle": "nested",
"i18n-ally.sortKeys": true,
"i18n-ally.namespace": false,
"i18n-ally.enabledParsers": ["ts"],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "zh-CN",
"i18n-ally.enabledFrameworks": ["vue", "react"],
"cSpell.words": [
"brotli",
"browserslist",
"codemirror",
"commitlint",
"cropperjs",
"echart",
"echarts",
"esnext",
"esno",
"iconify",
"INTLIFY",
"lintstagedrc",
"logicflow",
"nprogress",
"pinia",
"pnpm",
"qrcode",
"sider",
"sortablejs",
"stylelint",
"svgs",
"unocss",
"unplugin",
"unref",
"videojs",
"VITE",
"vitejs",
"vueuse",
"wangeditor",
"xingyu",
"yudao",
"zxcvbn"
],
// 控制相关文件嵌套展示
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.expand": false,
"explorer.fileNesting.patterns": {
"*.ts": "$(capture).test.ts, $(capture).test.tsx",
"*.tsx": "$(capture).test.ts, $(capture).test.tsx",
"*.env": "$(capture).env.*",
"package.json": "pnpm-lock.yaml,yarn.lock,LICENSE,README*,CHANGELOG*,CNAME,.gitattributes,.eslintrc-auto-import.json,.gitignore,prettier.config.js,stylelint.config.js,commitlint.config.js,.stylelintignore,.prettierignore,.gitpod.yml,.eslintrc.js,.eslintignore"
},
"terminal.integrated.scrollback": 10000,
"nuxt.isNuxtApp": false
}

81
LICENSE Normal file
View File

@@ -0,0 +1,81 @@
# Apache License
Version 2.0, January 2004
<http://www.apache.org/licenses/>
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
本软件受适用的国家软件著作权法(包括国际条约)和开源协议 双重保护许可。
开源协议中文释意如下1.JeeLowCode开源版本无任何限制在遵循本开源协议条款下允许商用使用不会造成侵权行为。2.允许基于本平台软件开展业务系统开发。3.在任何情况下,您不得使用本软件开发可能被认为与本软件竞争的软件。
最终解释权归:<http://www.jeelowcode.com>

439
README.md Normal file
View File

@@ -0,0 +1,439 @@
<a href="http://doc.jeelowcode.com/club" target="_blank">
<p align="center">
<img alt="logo" src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/xct.jpg">
</p>
</a>
<a href="http://doc.jeelowcode.com/club" target="_blank"> 🔥🔥🔥 前往俱乐部获取内测资格 🔥🔥🔥 </a>
<p align="center">
<img alt="logo" width=200" src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/logo.png">
</p>
<h4 align="center">在线轻松驾驭99.99%编程挑战</h4>
<p align="center">
<img src="https://img.shields.io/badge/JeeLowCode-1.0.0-red.svg" alt="Downloads">
<img src="https://img.shields.io/badge/Spring%20Boot-2.7.18-yellow.svg" alt="Downloads">
<img src="https://img.shields.io/badge/Vue-3.2-blue.svg" alt="Downloads">
<img src="https://img.shields.io/badge/license-Apache 2.0-green.svg" alt="Downloads">
<img src="https://img.shields.io/badge/可商用-免费-purple.svg" alt="Downloads">
</p>
## 1.项目简介
**JeeLowCode** 是一款基于芋道源码ruoyi-vue-pro精心二次封装的企业级低代码开发框架。在探索市场上众多低代码平台时我们发现它们不仅价格昂贵而且功能上往往不尽人意难以仅通过简单的界面配置就满足我们的开发需求。在这样的背景下寻找一款既免费又稳定同时易于使用的全开源低代码开发平台变得尤为困难。JeeLowCode 正是为了填补这一市场空缺而诞生的。
<br><br>
<img src="https://img.shields.io/badge/注意:-JeeLowCode 不允许任何形式的二次开源-red.svg" alt="Downloads">
## 2.在线体验
[体验地址http://demo.jeelowcode.com](http://demo.jeelowcode.com)
[社区地址http://doc.jeelowcode.com](http://doc.jeelowcode.com/)
[启动文档http://doc.jeelowcode.com/doc/1-5](http://doc.jeelowcode.com/doc/1-5)
[视频教程http://doc.jeelowcode.com/doc/1-6](http://doc.jeelowcode.com/doc/1-6)
## 3.代码架构
```
com.jeelowcode
├── jeelowcode-admin // 启动模块
├── jeelowcode-code // JeelowCode核心模块
├── jeelowcode-dependencies // 项目版本依赖模块
├── jeelowcode-framework // 功能模块
│ └── jeelowcode-excel // Excel导入导出模块
│ └── jeelowcode-exception // 自定义异常模块
│ └── jeelowcode-plus // SQL/DDL 语构建模块
│ └── jeelowcode-tenant // 租户模块
│ └── jeelowcode-utils // 工具类模块
├── jeelowcode-module // 个人业务相关
│ └── jeelowcode-module-api // 个人业务模块API
│ └── jeelowcode-module-biz // 个人业务业务
├── yudao-framework // 芋道核心模块
├── yudao-module // 芋道核心模块
```
## 4.项目关系
**后端项目**
| 项目 | Star | 简介 |
|--|--|---------|
| [JeeLowCode](https://gitcode.com/jeelowcode/jeelowcode)| [![Gitee star](https://gitee.com/jeelowecode/JeeLowCode/badge/star.svg)](https://gitee.com/jeelowecode/JeeLowCode) [![GitHub stars](https://img.shields.io/github/stars/jeelowcode/jeelowcode.svg?style=social&label=Stars)](https://github.com/jeelowcode/jeelowcode) [![star](https://gitcode.com/jeelowcode/jeelowcode/star/badge.svg)](https://gitcode.com/jeelowcode/jeelowcode) | 基于 Spring Boot 多模块架构 |
**前端项目**
| 项目 | Star | 简介 |
|--|--|---------------------------------------|
| [jeelowcode-ui-admin-vue3](https://gitcode.com/jeelowcode/jeelowcode-ui-admin-vue3)| [![Gitee star](https://gitee.com/jeelowecode/jeelowcode-ui-admin-vue3/badge/star.svg)](https://gitee.com/jeelowecode/jeelowcode-ui-admin-vue3) [![GitHub stars](https://img.shields.io/github/stars/jeelowcode/jeelowcode-ui-admin-vue3.svg?style=social&label=Stars)](https://github.com/jeelowcode/jeelowcode-ui-admin-vue3) [![star](https://gitcode.com/jeelowcode/jeelowcode-ui-admin-vue3/star/badge.svg)](https://gitcode.com/jeelowcode/jeelowcode-ui-admin-vue3) | 基于 Vue3 + Element Plus + Avue 实现的后台管理 |
## 5.系统架构图
<img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/jsjg2.png"/>
## 6.Hello World入门
只需要**4步**带你了解低代码JeeLowCode
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/hello1.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/hello2.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/hello3.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/hello4.png"/></td>
</tr>
</table>
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/hello5.png"/></td>
</tr>
</table>
## 7.演示效果图
### 7.1 手机端效果图:
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/app1.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/app2.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/app3.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/app5.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/app6.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/app7.png"/></td>
</tr>
</table>
### 7.2 电脑端效果图:
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/pc1.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/pc2.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/pc3.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/pc4.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/pc5.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/pc6.png"/></td>
</tr>
</table>
### 7.3 动态效果图:
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/gif1.gif"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/gif2.gif"/></td>
</tr>
</table>
## 8.框架核心亮点
### 8.1 首页:
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/jeelowcode-sy.png"/></td>
</tr>
</table>
### 8.2 在线表构建:
通过图形用户界面直观地创建数据表,一旦创建完成,即刻享有增、删、改、查、数据导入和导出的全面功能,操作简便,效率倍增。
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/bcj1.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/bcj2.png"/></td>
</tr>
</table>
### 8.3 在线统计报表:
只需配置简单的SQL语句即可迅速生成包括柱状图、折线图、饼图以及卡片视图在内的多样化统计报表直观展现数据分析结果。
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/jeelowcode-tj-pz.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/jeelowcode-tj.png"/></td>
</tr>
</table>
### 8.4 在线多表关联:
利用界面化的灵活配置,实现多表关联的直观展示,确保所见即所得的数据处理体验。
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/duobiao1.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/duobiao2.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/duobiao3.png"/></td>
</tr>
</table>
### 8.5 在线格式化字段显示:
为满足界面字段合并显示需求提供三种简捷处理方法数据库层面的SQL函数拼接查询时的SQL字符串合并以及应用层的Java代码处理。选择适合的方法以优化性能和灵活性。
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/zdgshxs1.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/zdgshxs2.png"/></td>
</tr>
</table>
### 8.6 在线排序设置:
通过拖放操作,用户可以直观地设置初始化数据的排序规则。
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/zdpx1.png"/></td>
</tr>
</table>
### 8.7 在线租户数据权限配置:
提供在线配置工具,轻松实现租户级别的数据权限设定,确保数据访问的安全性和合规性,提升**多租户**场景下的应用灵活性。**JeeLowCode**以其卓越的灵活性、高效性和易用性,成为加速数字化转型、驱动业务创新的理想选择。
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/8.jpeg"/></td>
</tr>
</table>
### 8.8 广泛数据库兼容:
<table>
<tr>
<th >数据库</th>
<th width="80%">是否支持</th>
</tr>
<tr>
<td >MySql</td>
<td >支持</td>
</tr>
<tr>
<td >Oracle11g</td>
<td >支持</td>
</tr>
<tr>
<td >PostgreSQL</td>
<td >支持</td>
</tr>
<tr>
<td >达梦</td>
<td >支持</td>
</tr>
</table>
### 8.9 在线表单设计:
提供丰富多样的控件,全面支持各类页面的开发需求。
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/zxbd1.png"/></td>
</tr>
</table>
### 8.10 丰富完善的示例:
丰富完善的示例,便于用户快速学习和上手
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/lizi1.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/lizi2.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/lizi3.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/lizi4.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/lizi5.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/lizi6.png"/></td>
</tr>
</table>
### 8.11 100+常用模板:
提供了丰富多样的常用页面模板,以便开发者能够迅速采纳和应用。
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/mb-sy1.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/mb-sy2.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/mb-ty1.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/mb-ty2.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/mb-ty3.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/mb-ty4.png"/></td>
</tr>
</table>
## 9.启动步骤
**温馨提示:** JDK、Maven、Node等可以从网盘下载<br>
[百度网盘地址https://pan.baidu.com/s/1ICmHRlrRYzBkx87zoRuqvQ?pwd=1234](https://pan.baidu.com/s/1ICmHRlrRYzBkx87zoRuqvQ?pwd=1234)
<br>
[阿里云盘地址https://www.alipan.com/s/X4kF7Hshuc2](https://www.alipan.com/s/X4kF7Hshuc2)
<br>
### 9.1 后台JAVA代码运行步骤
**环境配置**
**运行环境**JDK1.8
**开发工具:** Idea、Maven
**默认已启动中间件:(推荐使用宝塔)**[Mysql8.0](http://mysql.p2hp.com/)、[Redis](https://redis.io/)、[Minio](http://www.minio.org.cn/)
<table>
<tr>
<td>第一步下载JeelowCode项目并导入IDEA中</td>
</tr>
<tr>
<td>第二步导入数据库文件到mysql中并修改项目的数据库以及redis配置</td>
</tr>
<tr>
<td>第三步根据示例配置好对应数据库刷新Maven,再进行Complie编译,启动项目</td>
</tr>
</table>
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/bz1.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/bz2.png"/></td>
</tr>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/bz3.png"/></td>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/bz4.png"/></td>
</tr>
</table>
### 9.2 前端VUE代码运行步骤
**后台运行环境:** node18.0.0
**开发工具:** VsCode
<table>
<tr>
<td>第一步检查本地Node环境</td>
</tr>
<tr>
<td>第二步安装PNPM</td>
</tr>
<tr>
<td>第三步使用PNPM安装项目依赖</td>
</tr>
<tr>
<td>第四步:配置项目后台地址</td>
</tr>
<tr>
<td>第五步:启动项目</td>
</tr>
</table>
**第一步检查本地环境Node.js: 18.0.0**
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/13.jpg"/></td>
</tr>
</table>
**第二步安装PNPM提升依赖的安装速度**
1.先配置NPM仓库
```
npm config set registry https://registry.npmmirror.com
```
2.安装PNPM
```
npm install -g pnpm
```
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/14.jpg"/></td>
</tr>
</table>
**第三步:安装依赖**
进 入项目目录,执行
```
pnpm install
```
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/15.jpg"/></td>
</tr>
</table>
**第四步:配置后台地址**
修改项目根目录下文件.env.dev中的请求路径为本地后台地址
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/16.jpg"/></td>
</tr>
</table>
```
VITE_BASE_URL='http://127.0.0.1:48080'
```
**第五步:启动项目**
```
pnpm run dev-server
```
**访问地址**
<table>
<tr>
<td ><img src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/18.jpg"/></td>
</tr>
</table>
## 技术交流(广告勿扰):
<table>
<tr>
<td >JeeLowCode客服添加时备注进群</td>
<td >JeeLowCode公众号</td>
</tr>
<tr>
<td ><img height="320" width="250" src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/jeelowcode-kf.png"/></td>
<td ><img height="250" width="250" src="https://ai.oss.mj.ink/chatgpt/jeelowcode/gitee/wxgzh.jpg"/></td>
</tr>
</table>

206
README_API_MOCK.md Normal file
View File

@@ -0,0 +1,206 @@
# 大屏数据模拟接口系统
## 概述
本项目实现了一个完整的大屏数据模拟接口系统,用于替代硬编码的数据,实现数据的动态获取和更新。
## 文件结构
```
src/
├── api/
│ └── dashboard.ts # 模拟接口定义和数据
└── views/screen/
└── mainScreenV1.vue # 主大屏组件
```
## 核心功能
### 1. 模拟接口 (`src/api/dashboard.ts`)
#### 数据类型定义
- `DashboardData`: 完整的大屏数据结构
- 包含总计数量、园区统计、风险统计、告警数据、超时工单、隐患治理等
#### 主要接口
- `getDashboardData()`: 获取初始大屏数据
- `updateDashboardData()`: 获取更新的随机数据(用于动画演示)
- `getAlertDetails(type)`: 获取告警详情数据
- `getParkStatistics()`: 获取园区统计数据
- `getRiskStatistics()`: 获取风险统计数据
- `getHiddenDangerData()`: 获取隐患治理数据
### 2. 主组件集成 (`src/views/screen/mainScreenV1.vue`)
#### 数据管理
- 使用 `dashboardData` ref 存储从API获取的完整数据
- 通过 `initDashboardData()` 初始化数据
- 通过 `updateDashboardDataFromAPI()` 定期更新数据
#### 图表集成
- 所有图表数据都从 `dashboardData` 获取
- 支持数据更新后的图表自动刷新
- 保持原有的动画效果
## 使用方法
### 1. 初始化数据
```typescript
// 在组件挂载时初始化
onMounted(async () => {
try {
await initDashboardData()
// 初始化图表等其他操作
} catch (error) {
console.error('初始化失败:', error)
}
})
```
### 2. 定期更新数据
```typescript
// 设置定时器定期从API获取新数据
setInterval(async () => {
await updateDashboardDataFromAPI()
}, 15000) // 每15秒更新一次
```
### 3. 数据绑定
```vue
<template>
<!-- 使用可选链操作符安全访问数据 -->
<span>{{ dashboardData?.totalCount || 0 }}</span>
<span>{{ dashboardData?.alertData.total || 0 }}</span>
</template>
```
## 数据结构
### DashboardData 接口
```typescript
interface DashboardData {
totalCount: number // 总计数量
formalEmployeeCount: number // 正式员工数量
externalStaffCount: number // 外协人员数量
visitorCount: number // 访客数量
parkStatistics: { // 园区统计
name: string
formal: number
external: number
visitor: number
}[]
riskStatistics: { // 风险统计
overdue: number // 已逾期
processed: number // 已处理
pending: number // 待排查
processing: number // 处理中
other: number // 其他
}
alertData: { // 告警数据
total: number
processed: number
pending: number
details: AlertItem[]
}
timeoutWorkOrders: { // 超时工单
total: number
details: AlertItem[]
}
hiddenDangerData: { // 隐患治理数据
general: number // 一般隐患
major: number // 重大隐患
progress: { // 处理进度
overdue: number
processed: number
pending: number
processing: number
}
top3Types: { // Top3隐患类型
access: number // 门禁
consumption: number // 消费
inspection: number // 巡检
}
safetyIndex: number // 安全指数
}
}
```
## 优势
### 1. 数据解耦
- 将数据逻辑从组件中分离
- 便于后续替换为真实API
### 2. 类型安全
- 完整的TypeScript类型定义
- 编译时错误检查
### 3. 模拟真实环境
- 模拟网络延迟
- 随机数据生成
- 错误处理机制
### 4. 易于扩展
- 可以轻松添加新的数据字段
- 支持多种数据更新策略
## 替换为真实API
当需要连接真实API时只需要
1. 修改 `src/api/dashboard.ts` 中的接口调用
2. 将模拟数据替换为真实的HTTP请求
3. 保持接口签名不变
4. 组件代码无需修改
## 注意事项
1. **数据加载状态**: 建议添加loading状态管理
2. **错误处理**: 完善错误处理和用户提示
3. **数据缓存**: 考虑添加数据缓存机制
4. **性能优化**: 避免频繁的API调用
## 示例
### 添加新的数据字段
```typescript
// 在 DashboardData 接口中添加
interface DashboardData {
// ... 现有字段
newField: string
}
// 在模拟数据中添加
const mockData: DashboardData = {
// ... 现有数据
newField: '示例值'
}
// 在组件中使用
<span>{{ dashboardData?.newField || '' }}</span>
```
### 添加新的API接口
```typescript
// 在 dashboard.ts 中添加
export const getNewData = async (): Promise<string> => {
await delay(200)
return '新数据'
}
// 在组件中调用
const newData = await getNewData()
```
这个模拟接口系统为后续的真实API集成提供了良好的基础同时保持了代码的可维护性和扩展性。

185
README_DIGIT_SPLIT.md Normal file
View File

@@ -0,0 +1,185 @@
# 数字分割显示功能说明
## 功能概述
实现了将数字如23897分割成单个数字并分别显示在容器中的功能。每个数字都有独立的样式容器可以单独设置样式。**新增了丰富的动画效果,让数字动起来!**
## 实现原理
使用Vue 3的`computed`计算属性,将数字转换为字符串后分割成数组,然后通过`v-for`循环渲染每个数字。
## 主要特性
### 1. 总计数量显示
- 初始值23897
- 显示效果:每个数字独立显示在紫色背景的容器中
- 动态更新支持通过API调用更新数据
- **动画效果**:数字滚动动画、发光效果、悬停缩放
### 2. 员工类型数量显示
- 正式员工123人
- 外协人员45人
- 访客678人
- 每个数字类型都有独立的计算属性和更新方法
- **动画效果**:脉冲动画、悬停效果、颜色变化
### 3. 响应式更新
- 所有数字都支持动态更新
- 数字变化时,显示会自动重新计算和渲染
- **动画效果**:平滑的数字滚动、更新完成后的闪烁提示
### 4. 🎬 新增动画功能
- **数字滚动动画**:数字从当前值平滑滚动到目标值
- **缓动效果**:使用缓动函数让动画更自然流畅
- **视觉反馈**:数字更新完成后的闪烁效果
- **悬停交互**:鼠标悬停时的缩放和发光效果
- **周期性更新**:可设置定时自动更新数据
## 代码结构
### 响应式数据
```typescript
const totalCount = ref<number>(23897)
const formalEmployeeCount = ref<number>(123)
const externalStaffCount = ref<number>(45)
const visitorCount = ref<number>(678)
// 动画相关的状态
const isAnimating = ref<boolean>(false)
const animationDuration = 2000 // 动画持续时间(毫秒)
```
### 计算属性
```typescript
const totalCountDigits = computed(() => {
return String(totalCount.value).split('').map(Number)
})
```
### 动画方法
```typescript
// 数字滚动动画方法
const animateNumber = (startValue: number, endValue: number, duration: number, callback: (value: number) => void)
// 批量更新所有数字的方法
const updateAllCounts = (counts: { total?: number, formal?: number, external?: number, visitor?: number })
// 测试动画方法
const testAnimation = () => { /* 生成随机数据并触发动画 */ }
// 重置到原始数据
const resetToOriginal = () => { /* 重置所有数据到初始值 */ }
```
## 使用方法
### 1. 更新总计数量
```typescript
updateTotalCount(25678) // 会显示为 2 5 6 7 8带动画效果
```
### 2. 更新员工数量
```typescript
updateFormalEmployeeCount(156) // 正式员工1 5 6
updateExternalStaffCount(52) // 外协人员5 2
updateVisitorCount(789) // 访客7 8 9
```
### 3. 批量更新所有数据
```typescript
updateAllCounts({
total: 25678,
formal: 156,
external: 52,
visitor: 789
})
```
### 4. 从API获取数据
```typescript
// 示例从API获取数据后更新显示
const fetchData = async () => {
const response = await api.getEmployeeCount()
updateAllCounts({
total: response.totalCount,
formal: response.formalCount,
external: response.externalCount,
visitor: response.visitorCount
})
}
```
### 5. 测试动画效果
- 点击"测试动画"按钮:生成随机数据并触发动画
- 点击"重置数据"按钮:恢复到初始数据
- 动画进行中按钮会被禁用,防止重复触发
## 样式说明
### 总计数量样式
- 容器类:`.number-wrapper`
- 数字样式:`.total-number`
- 背景色:紫色 (rgb(177 74 201 / 100%))
- 尺寸26px × 50px
- **动画效果**
- 持续发光效果 (`numberGlow`)
- 悬停缩放 (1.1倍)
- 更新完成闪烁效果 (`flashEffect`)
### 员工类型数字样式
- 容器类:`.type-number-wrapper`
- 数字样式:`.type-number`
- 背景色:绿色 (#1afb8f)
- 尺寸14px × 25px
- **动画效果**
- 脉冲动画 (`typeNumberPulse`)
- 悬停缩放 (1.2倍) 和颜色变化
- 更新完成闪烁效果 (`typeFlashEffect`)
### 测试按钮样式
- 渐变背景:蓝紫色渐变
- 悬停效果:上移和阴影增强
- 禁用状态:半透明和禁用光标
## 动画特性详解
### 1. 数字滚动动画
- **持续时间**2秒可配置
- **缓动函数**easeOutQuart让动画更自然
- **性能优化**使用requestAnimationFrame确保流畅
### 2. 视觉反馈动画
- **发光效果**:数字容器持续发光,吸引注意力
- **悬停交互**:鼠标悬停时的缩放和阴影变化
- **闪烁提示**:数据更新完成后的白色闪烁效果
### 3. 动画状态管理
- **防重复触发**:动画进行中禁止新的动画
- **批量更新**:支持同时更新多个数字
- **完成回调**:动画完成后的闪烁效果
## 注意事项
1. **数字长度自适应**:容器会根据数字的位数自动调整显示
2. **性能优化**:使用计算属性确保只在数据变化时重新计算
3. **类型安全**使用TypeScript确保数据类型安全
4. **响应式设计**:支持不同屏幕尺寸的适配
5. **动画性能**使用CSS动画和requestAnimationFrame确保流畅
6. **防抖处理**:动画进行中防止重复触发
## 扩展功能
可以基于此功能扩展:
- **更多动画类型**:弹跳、旋转、淡入淡出等
- **数据可视化**:图表动画、进度条动画
- **交互增强**:拖拽、点击、手势等
- **主题切换**:不同主题下的动画效果
- **性能监控**:动画性能统计和优化建议
- **无障碍支持**:动画开关、减少动画等辅助功能
## 演示效果
- **页面加载**5秒后自动更新到新数据
- **周期性更新**每15秒自动生成随机数据并触发动画
- **手动测试**:点击测试按钮立即体验动画效果
- **数据重置**:一键恢复到初始状态
现在你的数字不仅能够分割显示,还能生动地动起来!🎉

803
build/js/gddt_main.js Normal file

File diff suppressed because one or more lines are too long

22
build/js/xlsx.full.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,4 @@
import i18n from './main.i18n.json';
import nlsPlugin, { Languages, esbuildPluginMonacoEditorNls } from './nls';
export default { i18n, nlsPlugin, Languages, esbuildPluginMonacoEditorNls }

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,392 @@
import fs from 'node:fs'
import path from 'node:path'
import type { Plugin } from 'vite'
import MagicString from 'magic-string'
export enum Languages {
bg = 'bg',
cs = 'cs',
de = 'de',
en_gb = 'en-gb',
es = 'es',
fr = 'fr',
hu = 'hu',
id = 'id',
it = 'it',
ja = 'ja',
ko = 'ko',
nl = 'nl',
pl = 'pl',
ps = 'ps',
pt_br = 'pt-br',
ru = 'ru',
tr = 'tr',
uk = 'uk',
zh_hans = 'zh-hans',
zh_hant = 'zh-hant',
}
export interface Options {
locale: Languages;
localeData?: Record<string, any>
}
/**
* 在vite中dev模式下会使用esbuild对node_modules进行预编译导致找不到映射表中的filepath
* 需要在预编译之前进行替换
* @param options 替换语言包
* @returns
*/
export function esbuildPluginMonacoEditorNls(options: Options): any {
options = Object.assign({ locale: Languages.en_gb }, options)
const CURRENT_LOCALE_DATA = getLocalizeMapping(options.locale, options.localeData)
return {
name: 'esbuild-plugin-monaco-editor-nls',
setup(build) {
build.onLoad({ filter: /esm[/\\]vs[/\\]nls\.js/ }, async () => {
return {
contents: getLocalizeCode(CURRENT_LOCALE_DATA),
loader: 'js',
}
})
build.onLoad(
{ filter: /monaco-editor[/\\]esm[/\\]vs.+\.js/ },
async args => {
return {
contents: transformLocalizeFuncCode(
args.path,
CURRENT_LOCALE_DATA,
),
loader: 'js',
}
},
)
},
}
}
/**
* 使用了monaco-editor-nls的语言映射包把原始localize(data, message)的方法替换成了localize(path, data, defaultMessage)
* vite build 模式下使用rollup处理
* @param options 替换语言包
* @returns
*/
export default function (options: Options): Plugin {
options = Object.assign({ locale: Languages.en_gb }, options)
const CURRENT_LOCALE_DATA = getLocalizeMapping(options.locale, options.localeData)
return {
name: 'rollup-plugin-monaco-editor-nls',
enforce: 'pre',
load(filepath) {
if (/esm[/\\]vs[/\\]nls\.js/.test(filepath)) {
return getLocalizeCode(CURRENT_LOCALE_DATA)
}
},
transform(code, filepath) {
if (
/monaco-editor[/\\]esm[/\\]vs.+\.js/.test(filepath)
&& !/esm[/\\]vs[/\\].*nls\.js/.test(filepath)
) {
const re = /monaco-editor[/\\]esm[/\\](.+)(?=\.js)/
if (re.exec(filepath) && code.includes('localize(')) {
let path = RegExp.$1
path = path.replaceAll('\\', '/')
code = code.replace(/localize\(/g, `localize('${path}', `)
return {
code: code,
/** 使用magic-string 生成 source map */
map: new MagicString(code).generateMap({
includeContent: true,
hires: true,
source: filepath,
}),
}
}
}
},
}
}
/**
* 替换调用方法接口参数,替换成相应语言包语言
* @param filepath 路径
* @param CURRENT_LOCALE_DATA 替换规则
* @returns
*/
function transformLocalizeFuncCode(
filepath: string,
_CURRENT_LOCALE_DATA: string,
) {
let code = fs.readFileSync(filepath, 'utf8')
const re = /monaco-editor[/\\]esm[/\\](.+)(?=\.js)/
if (re.exec(filepath)) {
let path = RegExp.$1
path = path.replaceAll('\\', '/')
code = code.replace(/localize\(/g, `localize('${path}', `)
}
return code
}
/**
* 获取语言包
* @param locale 语言
* @param localeData
* @returns
*/
function getLocalizeMapping(locale: Languages, localeData: Record<string, any> | undefined = undefined) {
if (localeData) return JSON.stringify(localeData)
const locale_data_path = path.join(__dirname, `./locale/${locale}.json`)
return fs.readFileSync(locale_data_path) as unknown as string
}
/**
* 替换代码
* @param CURRENT_LOCALE_DATA 语言包
* @returns
*/
function getLocalizeCode(CURRENT_LOCALE_DATA: string) {
return `
/* ---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
let isPseudo = typeof document !== 'undefined' && document.location && document.location.hash.indexOf('pseudo=true') >= 0
const DEFAULT_TAG = 'i-default'
function _format(message, args) {
let result
if (args.length === 0) {
result = message
} else {
result = message.replace(/{(\\d+)}/g, (match, rest) => {
const index = rest[0]
const arg = args[index]
let result = match
if (typeof arg === 'string') {
result = arg
} else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) {
result = String(arg)
}
return result
})
}
if (isPseudo) {
// FF3B and FF3D is the Unicode zenkaku representation for [ and ]
result = \`\uFF3B\${result.replace(/[aeiou]/g, '$&$&')}\uFF3D\`
}
return result
}
function findLanguageForModule(config, name) {
let result = config[name]
if (result) {
return result
}
result = config['*']
if (result) {
return result
}
return null
}
function endWithSlash(path) {
if (path.charAt(path.length - 1) === '/') {
return path
}
return \`\${path}/\`
}
async function getMessagesFromTranslationsService(translationServiceUrl, language, name) {
const url = \`\${endWithSlash(translationServiceUrl) + endWithSlash(language)}vscode/\${endWithSlash(name)}\`
const res = await fetch(url)
if (res.ok) {
const messages = await res.json()
return messages
}
throw new Error(\`\${res.status} - \${res.statusText}\`)
}
function createScopedLocalize(scope) {
return function(idx, defaultValue) {
const restArgs = Array.prototype.slice.call(arguments, 2)
return _format(scope[idx], restArgs)
}
}
function createScopedLocalize2(scope) {
return (idx, defaultValue, ...args) => ({
value: _format(scope[idx], args),
original: _format(defaultValue, args),
})
}
// export function localize(data, message, ...args) {
// return _format(message, args);
// }
// ------------------------invoke----------------------------------------
export function localize(path, data, defaultMessage, ...args) {
var key = typeof data === 'object' ? data.key : data;
var data = ${CURRENT_LOCALE_DATA} || {};
var message = (data[path] || data?.contents?.[path] || {})[key];
if (!message) {
message = defaultMessage;
}
return _format(message, args);
}
// ------------------------invoke----------------------------------------
/**
* @skipMangle
*/
export function localize2(data, message, ...args) {
const original = _format(message, args)
return {
value: original,
original,
}
}
/**
* @skipMangle
*/
export function getConfiguredDefaultLocale(_) {
// This returns undefined because this implementation isn't used and is overwritten by the loader
// when loaded.
return undefined
}
/**
* @skipMangle
*/
export function setPseudoTranslation(value) {
isPseudo = value
}
/**
* Invoked in a built product at run-time
* @skipMangle
*/
export function create(key, data) {
var _a
return {
localize: createScopedLocalize(data[key]),
localize2: createScopedLocalize2(data[key]),
getConfiguredDefaultLocale: (_a = data.getConfiguredDefaultLocale) !== null && _a !== void 0 ? _a : _ => undefined,
}
}
/**
* Invoked by the loader at run-time
* @skipMangle
*/
export function load(name, req, load, config) {
var _a
const pluginConfig = (_a = config['vs/nls']) !== null && _a !== void 0 ? _a : {}
if (!name || name.length === 0) {
// TODO: We need to give back the mangled names here
return load({
localize: localize,
localize2: localize2,
getConfiguredDefaultLocale: () => {
var _a
return (_a = pluginConfig.availableLanguages) === null || _a === void 0 ? void 0 : _a['*']
},
})
}
const language = pluginConfig.availableLanguages ? findLanguageForModule(pluginConfig.availableLanguages, name) : null
const useDefaultLanguage = language === null || language === DEFAULT_TAG
let suffix = '.nls'
if (!useDefaultLanguage) {
suffix = \`\${suffix}.\${language}\`
}
const messagesLoaded = messages => {
if (Array.isArray(messages)) {
messages.localize = createScopedLocalize(messages)
messages.localize2 = createScopedLocalize2(messages)
} else {
messages.localize = createScopedLocalize(messages[name])
messages.localize2 = createScopedLocalize2(messages[name])
}
messages.getConfiguredDefaultLocale = () => {
var _a
return (_a = pluginConfig.availableLanguages) === null || _a === void 0 ? void 0 : _a['*']
}
load(messages)
}
if (typeof pluginConfig.loadBundle === 'function') {
pluginConfig.loadBundle(name, language, (err, messages) => {
// We have an error. Load the English default strings to not fail
if (err) {
req([\`\${name}.nls\`], messagesLoaded)
} else {
messagesLoaded(messages)
}
})
} else if (pluginConfig.translationServiceUrl && !useDefaultLanguage) {
(async() => {
var _a
try {
const messages = await getMessagesFromTranslationsService(pluginConfig.translationServiceUrl, language, name)
return messagesLoaded(messages)
} catch (err) {
// Language is already as generic as it gets, so require default messages
if (!language.includes('-')) {
console.error(err)
return req([\`\${name}.nls\`], messagesLoaded)
}
try {
// Since there is a dash, the language configured is a specific sub-language of the same generic language.
// Since we were unable to load the specific language, try to load the generic language. Ex. we failed to find a
// Swiss German (de-CH), so try to load the generic German (de) messages instead.
const genericLanguage = language.split('-')[0]
const messages = await getMessagesFromTranslationsService(pluginConfig.translationServiceUrl, genericLanguage, name);
// We got some messages, so we configure the configuration to use the generic language for this session.
(_a = pluginConfig.availableLanguages) !== null && _a !== void 0 ? _a : pluginConfig.availableLanguages = {}
pluginConfig.availableLanguages['*'] = genericLanguage
return messagesLoaded(messages)
} catch (err) {
console.error(err)
return req([\`\${name}.nls\`], messagesLoaded)
}
}
})()
} else {
req([name + suffix], messagesLoaded, err => {
if (suffix === '.nls') {
console.error('Failed trying to load default language strings', err)
return
}
console.error(\`Failed to load message bundle for language \${language}. Falling back to the default language:\`, err)
req([\`\${name}.nls\`], messagesLoaded)
})
}
}
`
}

124
build/vite/index.ts Normal file
View File

@@ -0,0 +1,124 @@
import { resolve } from 'path'
import Vue from '@vitejs/plugin-vue'
import VueJsx from '@vitejs/plugin-vue-jsx'
import progress from 'vite-plugin-progress'
import EslintPlugin from 'vite-plugin-eslint'
import PurgeIcons from 'vite-plugin-purge-icons'
import { ViteEjsPlugin } from 'vite-plugin-ejs'
// @ts-ignore
import ElementPlus from 'unplugin-element-plus/vite'
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import viteCompression from 'vite-plugin-compression'
import topLevelAwait from 'vite-plugin-top-level-await'
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import UnoCSS from 'unocss/vite'
// vs code 编辑器配置
import monacoEditorPlugin from 'vite-plugin-monaco-editor'
import MEditor from '../monacoEditor';
import { lazyImport, VxeResolver } from 'vite-plugin-lazy-import'
export function createVitePlugins() {
const root = process.cwd()
// 路径查找
function pathResolve(dir: string) {
return resolve(root, '.', dir)
}
return [
Vue(),
VueJsx(),
UnoCSS(),
progress(),
PurgeIcons(),
ElementPlus({}),
AutoImport({
include: [
/\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
/\.vue$/,
/\.vue\?vue/, // .vue
/\.md$/ // .md
],
imports: [
'vue',
'vue-router',
// 可额外添加需要 autoImport 的组件
{
'@/hooks/web/useI18n': ['useI18n'],
'@/hooks/web/useMessage': ['useMessage'],
'@/utils/formRules': ['required'],
'@/utils/dict': ['DICT_TYPE'],
'@/hooks/design/useCrudHeight': ['useCrudHeight'],
'@/hooks/design/useCrudPermi': ['useCrudPermi'],
}
],
dts: 'src/types/auto-imports.d.ts',
resolvers: [ElementPlusResolver(), IconsResolver({ prefix: 'Icon', })],
eslintrc: {
enabled: false, // Default `false`
filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json`
globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')
}
}),
Components({
// 生成自定义 `auto-components.d.ts` 全局声明
dts: 'src/types/auto-components.d.ts',
// 自定义组件的解析器
resolvers: [ElementPlusResolver(), IconsResolver({ enabledCollections: ['ep'] })],
globs: ["src/components/**/**.{vue, md}", '!src/components/DiyEditor/components/mobile/**', '!src/components/LowFormDesign/components']
}),
Icons({
autoInstall: true,
}),
EslintPlugin({
cache: false,
include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件
}),
VueI18nPlugin({
runtimeOnly: true,
compositionOnly: true,
include: [resolve(__dirname, 'src/locales/**')]
}),
createSvgIconsPlugin({
iconDirs: [pathResolve('src/assets/svgs')],
symbolId: 'icon-[dir]-[name]',
svgoOptions: true
}),
viteCompression({
verbose: true, // 是否在控制台输出压缩结果
disable: false, // 是否禁用
threshold: 10240, // 体积大于 threshold 才会被压缩,单位 b
algorithm: 'gzip', // 压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
ext: '.gz', // 生成的压缩包后缀
deleteOriginFile: false //压缩后是否删除源文件
}),
ViteEjsPlugin(),
topLevelAwait({
// https://juejin.cn/post/7152191742513512485
// The export name of top-level await promise for each chunk module
promiseExportName: '__tla',
// The function to generate import names of top-level await promise in each chunk module
promiseImportName: (i) => `__tla_${i}`
}),
monacoEditorPlugin({
languageWorkers: ['editorWorkerService', 'typescript', 'json', 'css']
}),
lazyImport({
resolvers: [
VxeResolver({ libraryName: 'vxe-table' }),
VxeResolver({ libraryName: 'vxe-pc-ui' })
]
}),
MEditor.nlsPlugin({ //monacoEditor汉化
locale: MEditor.Languages.zh_hans,
localeData: MEditor.i18n,
}),
]
}

154
build/vite/optimize.ts Normal file
View File

@@ -0,0 +1,154 @@
import MEditor from '../monacoEditor';
const include = [
'qs',
'url',
'vue',
'sass',
'mitt',
'axios',
'pinia',
'dayjs',
'qrcode',
'unocss',
'vue-router',
'vue-types',
'vue-i18n',
'crypto-js',
'cropperjs',
'lodash-es',
'nprogress',
'web-storage-cache',
'@iconify/iconify',
'@vueuse/core',
'@zxcvbn-ts/core',
'echarts/core',
'echarts/charts',
'echarts/components',
'echarts/renderers',
'echarts-wordcloud',
'@wangeditor/editor',
'@wangeditor/editor-for-vue',
'element-plus',
'element-plus/es',
'element-plus/es/locale/lang/zh-cn',
'element-plus/es/locale/lang/en',
'element-plus/es/components/avatar/style/css',
'element-plus/es/components/space/style/css',
'element-plus/es/components/backtop/style/css',
'element-plus/es/components/form/style/css',
'element-plus/es/components/radio-group/style/css',
'element-plus/es/components/radio/style/css',
'element-plus/es/components/checkbox/style/css',
'element-plus/es/components/checkbox-group/style/css',
'element-plus/es/components/switch/style/css',
'element-plus/es/components/time-picker/style/css',
'element-plus/es/components/date-picker/style/css',
'element-plus/es/components/descriptions/style/css',
'element-plus/es/components/descriptions-item/style/css',
'element-plus/es/components/link/style/css',
'element-plus/es/components/tooltip/style/css',
'element-plus/es/components/drawer/style/css',
'element-plus/es/components/dialog/style/css',
'element-plus/es/components/checkbox-button/style/css',
'element-plus/es/components/option-group/style/css',
'element-plus/es/components/radio-button/style/css',
'element-plus/es/components/cascader/style/css',
'element-plus/es/components/color-picker/style/css',
'element-plus/es/components/input-number/style/css',
'element-plus/es/components/rate/style/css',
'element-plus/es/components/select-v2/style/css',
'element-plus/es/components/tree-select/style/css',
'element-plus/es/components/slider/style/css',
'element-plus/es/components/time-select/style/css',
'element-plus/es/components/autocomplete/style/css',
'element-plus/es/components/image-viewer/style/css',
'element-plus/es/components/upload/style/css',
'element-plus/es/components/col/style/css',
'element-plus/es/components/form-item/style/css',
'element-plus/es/components/alert/style/css',
'element-plus/es/components/select/style/css',
'element-plus/es/components/input/style/css',
'element-plus/es/components/breadcrumb-item/style/css',
'element-plus/es/components/tag/style/css',
'element-plus/es/components/pagination/style/css',
'element-plus/es/components/table/style/css',
'element-plus/es/components/table-v2/style/css',
'element-plus/es/components/table-column/style/css',
'element-plus/es/components/card/style/css',
'element-plus/es/components/row/style/css',
'element-plus/es/components/button/style/css',
'element-plus/es/components/menu/style/css',
'element-plus/es/components/sub-menu/style/css',
'element-plus/es/components/menu-item/style/css',
'element-plus/es/components/option/style/css',
'element-plus/es/components/dropdown/style/css',
'element-plus/es/components/dropdown-menu/style/css',
'element-plus/es/components/dropdown-item/style/css',
'element-plus/es/components/skeleton/style/css',
'element-plus/es/components/tree/style/css',
'element-plus/es/components/badge/style/css',
'element-plus/es/components/breadcrumb/style/css',
'element-plus/es/components/image/style/css',
'element-plus/es/components/collapse-transition/style/css',
'element-plus/es/components/timeline/style/css',
'element-plus/es/components/timeline-item/style/css',
'element-plus/es/components/collapse/style/css',
'element-plus/es/components/collapse-item/style/css',
'element-plus/es/components/button-group/style/css',
'element-plus/es/components/text/style/css',
'element-plus/es/components/header/style/css',
'element-plus/es/components/popconfirm/style/css',
'element-plus/es/components/empty/style/css',
'element-plus/es/components/loading/style/css',
'element-plus/es/components/container/style/css',
'element-plus/es/components/main/style/css',
'element-plus/es/components/aside/style/css',
'element-plus/es/components/progress/style/css',
'element-plus/es/components/steps/style/css',
'element-plus/es/components/step/style/css',
'@smallwei/avue',
'@smallwei/avue/lib/index.css',
'monaco-editor/esm/vs/editor/editor.main',
'vxe-table/es/vxe-ui/index.js',
'@kangc/v-md-editor',
'@kangc/v-md-editor/lib/preview',
'@kangc/v-md-editor/lib/style/preview.css',
'@kangc/v-md-editor/lib/theme/github.js',
'@kangc/v-md-editor/lib/theme/style/github.css',
'highlight',
'@kangc/v-md-editor/lib/codemirror-editor',
'@kangc/v-md-editor/lib/style/codemirror-editor.css',
'@kangc/v-md-editor/lib/plugins/todo-list/index',
'@kangc/v-md-editor/lib/plugins/todo-list/todo-list.css',
'@kangc/v-md-editor/lib/plugins/tip/index',
'@kangc/v-md-editor/lib/plugins/tip/tip.css',
'codemirror',
'codemirror/mode/markdown/markdown',
'codemirror/mode/javascript/javascript',
'codemirror/mode/css/css',
'codemirror/mode/htmlmixed/htmlmixed',
'codemirror/mode/vue/vue',
'codemirror/addon/edit/closebrackets',
'codemirror/addon/edit/closetag',
'codemirror/addon/edit/matchbrackets',
'codemirror/addon/display/placeholder',
'codemirror/addon/selection/active-line',
'codemirror/addon/scroll/simplescrollbars',
'codemirror/addon/scroll/simplescrollbars.css',
'codemirror/lib/codemirror.css',
]
const exclude = ['@iconify/json']
const esbuildOptions = {
plugins: [
//monacoEditor汉化
MEditor.esbuildPluginMonacoEditorNls({
locale: MEditor.Languages.zh_hans,
localeData: MEditor.i18n,
}),
],
}
export { include, exclude, esbuildOptions }

164
index.html Normal file
View File

@@ -0,0 +1,164 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=0, maximum-scale=1.0, user-scalable=yes, shrink-to-fit=no" />
<meta
name="keywords"
content="JeeLowCode 基于 vue3 + CompositionAPI + typescript + vite3 + element plus + avue 的低代码平台,免费开源!"
/>
<meta
name="description"
content="JeeLowCode 基于 vue3 + CompositionAPI + typescript + vite3 + element plus + avue 的低代码平台,免费开源!"
/>
<title>%VITE_APP_TITLE%</title>
<!-- 高德地图配置 -->
<script>
// note by yang chen jj on 2025.09.29, close the map Gao De
// window._AMapSecurityConfig = {
// securityJsCode: '' //高德地图安全密钥
// }
</script>
<!-- note by yang chen jj on 2025.09.29 close the map Gao De -->
<!-- <script-->
<!-- type="text/javascript"-->
<!-- src="https://webapi.amap.com/maps?v=2.0&key=高德地图key&plugin=AMap.PlaceSearch"-->
<!-- ></script>-->
<!-- <script src="./build/js/gddt_main.js"></script>-->
<!-- <script src="./build/js/xlsx.full.min.js"></script>-->
</head>
<body>
<div id="app">
<style>
.app-loading {
display: flex;
width: 100%;
height: 100%;
justify-content: center;
align-items: center;
flex-direction: column;
background: #f0f2f5;
}
.app-loading .app-loading-wrap {
position: absolute;
top: 50%;
left: 50%;
display: flex;
-webkit-transform: translate3d(-50%, -50%, 0);
transform: translate3d(-50%, -50%, 0);
justify-content: center;
align-items: center;
flex-direction: column;
}
.app-loading .app-loading-title {
margin-bottom: 30px;
font-size: 20px;
font-weight: bold;
text-align: center;
}
.app-loading .app-loading-logo {
width: 400px;
margin: 0 auto 15px auto;
}
.app-loading .app-loading-item {
position: relative;
display: inline-block;
width: 60px;
height: 60px;
vertical-align: middle;
border-radius: 50%;
}
.app-loading .app-loading-outter {
position: absolute;
width: 100%;
height: 100%;
border: 4px solid #2d8cf0;
border-bottom: 0;
border-left-color: transparent;
border-radius: 50%;
animation: loader-outter 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
}
.app-loading .app-loading-inner {
position: absolute;
top: calc(50% - 20px);
left: calc(50% - 20px);
width: 40px;
height: 40px;
border: 4px solid #87bdff;
border-right: 0;
border-top-color: transparent;
border-radius: 50%;
animation: loader-inner 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
}
@-webkit-keyframes loader-outter {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes loader-outter {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-webkit-keyframes loader-inner {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(-360deg);
transform: rotate(-360deg);
}
}
@keyframes loader-inner {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(-360deg);
transform: rotate(-360deg);
}
}
</style>
<div class="app-loading">
<div class="app-loading-wrap">
<div class="app-loading-title">
<img src="./src/assets/imgs/logo.png" class="app-loading-logo" alt="Logo" />
</div>
<div class="app-loading-item">
<div class="app-loading-outter"></div>
<div class="app-loading-inner"></div>
</div>
</div>
</div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

156
package.json Normal file
View File

@@ -0,0 +1,156 @@
{
"name": "jeelowcode-ui-admin-vue3",
"version": "1.0.0",
"description": "基于vue3、vite4、element-plus、avue、typesScript",
"author": "jeelowcode",
"private": false,
"scripts": {
"i": "pnpm install",
"dev": "vite --mode env.local",
"dev-server": "vite --mode dev",
"ts:check": "vue-tsc --noEmit",
"build:local": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build",
"build:dev": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode dev",
"build:test": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode test",
"build:stage": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode stage",
"build:prod": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode prod",
"build:office": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode office",
"serve:dev": "vite preview --mode dev",
"serve:prod": "vite preview --mode prod",
"preview": "pnpm build:local-dev && vite preview",
"clean": "npx rimraf node_modules",
"clean:cache": "npx rimraf node_modules/.cache",
"lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src",
"lint:format": "prettier --write --loglevel warn \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"",
"lint:style": "stylelint --fix \"./src/**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged -c "
},
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"@iconify/iconify": "^3.1.1",
"@kangc/v-md-editor": "^2.3.18",
"@smallwei/avue": "3.6.1",
"@videojs-player/vue": "^1.0.0",
"@vueuse/core": "^10.6.1",
"@zxcvbn-ts/core": "^3.0.4",
"animate.css": "^4.1.1",
"avue-plugin-ueditor": "^1.0.4",
"axios": "^1.7.2",
"benz-amr-recorder": "^1.1.5",
"bpmn-js-token-simulation": "^0.10.0",
"camunda-bpmn-moddle": "^7.0.1",
"codemirror": "5.61.1",
"cropperjs": "^1.6.1",
"crypto-js": "^4.2.0",
"dayjs": "^1.11.10",
"diagram-js": "^12.8.0",
"driver.js": "^1.3.1",
"echarts": "^5.4.3",
"echarts-wordcloud": "^2.1.0",
"element-plus": "^2.9.0",
"fast-xml-parser": "^4.3.2",
"highlight.js": "^11.9.0",
"jsencrypt": "^3.3.2",
"lodash-es": "^4.17.21",
"magic-string": "^0.30.11",
"min-dash": "^4.1.1",
"mitt": "^3.0.1",
"monaco-editor": "^0.49.0",
"nprogress": "^0.2.0",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
"qrcode": "^1.5.3",
"qs": "^6.11.2",
"sortablejs": "^1.15.2",
"sql-formatter": "^15.4.0",
"steady-xml": "^0.1.0",
"tinycolor2": "^1.6.0",
"url": "^0.11.3",
"video.js": "^7.21.5",
"vue": "^3.4.27",
"vue-dompurify-html": "^4.1.4",
"vue-i18n": "^9.13.1",
"vue-router": "^4.3.2",
"vue-types": "^5.1.2",
"vue3-lottie": "^3.3.1",
"vuedraggable": "^4.1.0",
"vxe-pc-ui": "^4.0.17",
"vxe-table": "^4.7.17",
"web-storage-cache": "^1.1.1",
"xml-js": "^1.6.11"
},
"devDependencies": {
"@commitlint/cli": "^19.3.0",
"@commitlint/config-conventional": "^19.2.2",
"@iconify/json": "^2.2.142",
"@intlify/unplugin-vue-i18n": "^4.0.0",
"@purge-icons/generated": "^0.9.0",
"@swc/core": "~1.6.0",
"@types/lodash-es": "^4.17.11",
"@types/node": "^20.13.0",
"@types/nprogress": "^0.2.3",
"@types/qrcode": "^1.5.5",
"@types/qs": "^6.9.15",
"@typescript-eslint/eslint-plugin": "^7.11.0",
"@typescript-eslint/parser": "^7.11.0",
"@unocss/eslint-config": "^0.60.4",
"@unocss/transformer-variant-group": "^0.57.4",
"@vitejs/plugin-legacy": "^5.4.1",
"@vitejs/plugin-vue": "^5.0.5",
"@vitejs/plugin-vue-jsx": "^4.0.0",
"autoprefixer": "^10.4.19",
"bpmn-js": "8.9.0",
"bpmn-js-properties-panel": "0.46.0",
"consola": "^3.2.3",
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-define-config": "^2.1.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-vue": "^9.26.0",
"lint-staged": "^15.1.0",
"postcss": "^8.4.31",
"postcss-html": "^1.5.0",
"postcss-scss": "^4.0.9",
"rimraf": "^5.0.5",
"rollup": "^4.4.1",
"sass": "^1.69.5",
"stylelint": "^15.11.0",
"stylelint-config-html": "^1.1.0",
"stylelint-config-recommended": "^13.0.0",
"stylelint-config-standard": "^34.0.0",
"stylelint-order": "^6.0.3",
"terser": "^5.24.0",
"typescript": "5.2.2",
"unocss": "^0.57.4",
"unplugin-auto-import": "^0.16.7",
"unplugin-element-plus": "^0.8.0",
"unplugin-icons": "^0.19.0",
"unplugin-vue-components": "^0.25.2",
"vite": "5.2.12",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-ejs": "^1.7.0",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-lazy-import": "^1.0.7",
"vite-plugin-monaco-editor": "^1.1.0",
"vite-plugin-progress": "^0.0.7",
"vite-plugin-purge-icons": "^0.9.2",
"vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-top-level-await": "^1.3.1",
"vue-eslint-parser": "^9.3.2",
"vue-tsc": "^2.0.19"
},
"license": "Apache-2.0",
"repository": {
"type": "git",
"url": "git+https://gitee.com/jeelowecode/JeeLowCode"
},
"bugs": {
"url": "https://gitee.com/jeelowecode/JeeLowCode/issues"
},
"homepage": "https://gitee.com/jeelowecode/JeeLowCode",
"packageManager": "pnpm@8.6.0",
"engines": {
"node": ">= 18.0.0",
"pnpm": ">=8.6.0"
}
}

5
postcss.config.js Normal file
View File

@@ -0,0 +1,5 @@
module.exports = {
plugins: {
autoprefixer: {}
}
}

22
prettier.config.js Normal file
View File

@@ -0,0 +1,22 @@
module.exports = {
printWidth: 100, // 每行代码长度默认80
tabWidth: 2, // 每个tab相当于多少个空格默认2ab进行缩进默认false
useTabs: false, // 是否使用tab
semi: false, // 声明结尾使用分号(默认true)
vueIndentScriptAndStyle: false,
singleQuote: true, // 使用单引号默认false
quoteProps: 'as-needed',
bracketSpacing: true, // 对象字面量的大括号间使用空格默认true
trailingComma: 'none', // 多行使用拖尾逗号默认none
jsxSingleQuote: false,
// 箭头函数参数括号 默认avoid 可选 avoid| always
// avoid 能省略括号的时候就省略 例如x => x
// always 总是有括号
arrowParens: 'always',
insertPragma: false,
requirePragma: false,
proseWrap: 'never',
htmlWhitespaceSensitivity: 'strict',
endOfLine: 'auto',
rangeStart: 0
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
public/home.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
public/img/11.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/img/avatar1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
public/img/bd1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

BIN
public/img/bd2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

BIN
public/img/bd3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

BIN
public/img/bi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 B

BIN
public/img/blackfyzd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/img/blackhyzm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
public/img/blacklltz.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
public/img/blacksptg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/img/fxsc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
public/img/gdfw.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/img/gj.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 914 B

BIN
public/img/gj1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

BIN
public/img/gj2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

BIN
public/img/hq1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/img/huo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 734 B

BIN
public/img/huo1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

1
public/img/img1.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655452688218" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1156" width="64" height="64"><path d="M704 992H192c-70.4 0-128-57.6-128-128V160c0-70.4 57.6-128 128-128h512c70.4 0 128 57.6 128 128v704c0 70.4-57.6 128-128 128z" fill="#4E8DF6" p-id="1157"></path><path d="M497.6 308.8H233.6c-25.6 0-48-20.8-48-48v-11.2c0-25.6 20.8-48 48-48H496c25.6 0 48 20.8 48 48v11.2c1.6 25.6-20.8 48-46.4 48zM440 492.8H233.6c-25.6 0-48-20.8-48-48v-11.2c0-25.6 20.8-48 48-48h206.4c25.6 0 48 22.4 48 48v11.2c0 27.2-20.8 48-48 48z" fill="#FFFFFF" p-id="1158"></path><path d="M936 193.6l-57.6-36.8c-24-14.4-56-8-70.4 16l-36.8 56c-4.8 8-3.2 19.2 6.4 24l115.2 70.4c8 4.8 19.2 3.2 24-4.8l36.8-56c14.4-22.4 6.4-54.4-17.6-68.8zM512 670.4l113.6 70.4c8 4.8 19.2 3.2 25.6-4.8L880 379.2c4.8-8 3.2-19.2-6.4-25.6l-113.6-70.4c-8-4.8-19.2-3.2-25.6 4.8L505.6 646.4c-4.8 8-3.2 19.2 6.4 24zM483.2 872l116.8-78.4c11.2-8 9.6-22.4 0-30.4L500.8 704c-11.2-6.4-25.6 0-27.2 12.8l-19.2 139.2c-1.6 14.4 16 25.6 28.8 16z" fill="#E1E1DF" p-id="1159"></path><path d="M752 473.6c9.6 6.4 20.8 3.2 27.2-6.4l36.8-56c6.4-9.6 3.2-20.8-6.4-27.2-9.6-6.4-20.8-3.2-27.2 6.4l-36.8 56c-4.8 9.6-3.2 20.8 6.4 27.2z" fill="#2166CC" p-id="1160"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
public/img/img2.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655452955129" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1733" width="48" height="48"><path d="M832 988.8H192c-70.4 0-128-57.6-128-128v-544c0-70.4 57.6-128 128-128h640c70.4 0 128 57.6 128 128v544c0 70.4-57.6 128-128 128z" fill="#E1E1DF" p-id="1734"></path><path d="M536 931.2h-256c-70.4 0-128-57.6-128-128v-640c0-70.4 57.6-128 128-128h256c70.4 0 128 57.6 128 128v640c0 70.4-57.6 128-128 128z" fill="#4E8DF6" p-id="1735"></path><path d="M536 235.2h-112c-12.8 0-24-11.2-24-24s11.2-24 24-24h112c12.8 0 24 11.2 24 24s-11.2 24-24 24z" fill="#FFFFFF" p-id="1736"></path><path d="M296 211.2m-56 0a56 56 0 1 0 112 0 56 56 0 1 0-112 0Z" fill="#FFFFFF" p-id="1737"></path><path d="M536 408h-112c-12.8 0-24-11.2-24-24s11.2-24 24-24h112c12.8 0 24 11.2 24 24s-11.2 24-24 24z" fill="#FFFFFF" p-id="1738"></path><path d="M296 384m-56 0a56 56 0 1 0 112 0 56 56 0 1 0-112 0Z" fill="#FFFFFF" p-id="1739"></path><path d="M536 596.8h-112c-12.8 0-24-11.2-24-24s11.2-24 24-24h112c12.8 0 24 11.2 24 24 0 14.4-11.2 24-24 24z" fill="#FFFFFF" p-id="1740"></path><path d="M296 572.8m-56 0a56 56 0 1 0 112 0 56 56 0 1 0-112 0Z" fill="#FFFFFF" p-id="1741"></path><path d="M872 553.6l-172.8-99.2c-14.4-8-33.6-8-48 0L480 553.6c-14.4 8-24 24-24 41.6v198.4c0 17.6 9.6 33.6 24 41.6l172.8 99.2c14.4 8 33.6 8 48 0l172.8-99.2c14.4-8 24-24 24-41.6V595.2c-1.6-17.6-11.2-32-25.6-41.6z" fill="#2166CC" p-id="1742"></path><path d="M747.2 598.4L640 712l-32-33.6c-14.4-14.4-36.8-14.4-51.2 0-14.4 16-14.4 38.4 0 52.8l54.4 59.2c6.4 8 16 11.2 25.6 11.2s19.2-3.2 25.6-11.2l131.2-139.2c14.4-14.4 16-38.4 1.6-52.8-11.2-14.4-35.2-14.4-48 0z" fill="#FFFFFF" p-id="1743"></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

1
public/img/img3.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655452859204" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1349" width="48" height="48"><path d="M740.8 992h-512c-70.4 0-128-57.6-128-128V160c0-70.4 57.6-128 128-128h512c70.4 0 128 57.6 128 128v704c0 70.4-57.6 128-128 128z" fill="#4E8DF6" p-id="1350"></path><path d="M532.8 308.8H270.4c-25.6 0-48-20.8-48-48v-11.2c0-25.6 22.4-48 48-48h262.4c27.2 0 48 20.8 48 48v11.2c0 25.6-20.8 48-48 48zM476.8 492.8h-208c-25.6 0-48-20.8-48-48v-11.2c0-25.6 22.4-48 48-48h206.4c25.6 0 48 22.4 48 48v11.2c1.6 27.2-19.2 48-46.4 48z" fill="#FFFFFF" p-id="1351"></path><path d="M878.4 976H552c-22.4 0-40-17.6-40-40v-12.8c0-22.4 17.6-40 40-40h324.8c22.4 0 40 17.6 40 40v12.8c0 20.8-17.6 40-38.4 40z" fill="#2166CC" p-id="1352"></path><path d="M942.4 816l-169.6-27.2c3.2-48 11.2-94.4 24-139.2 19.2-20.8 30.4-48 30.4-76.8v-4.8c-3.2-59.2-51.2-105.6-112-105.6-59.2 0-108.8 46.4-112 105.6v4.8c0 28.8 11.2 56 30.4 76.8 12.8 44.8 20.8 92.8 24 139.2L488 816c-12.8 1.6-24 12.8-24 27.2v57.6c0 14.4 12.8 27.2 27.2 27.2h4.8v6.4c0 14.4 6.4 28.8 16 40s24 16 38.4 16h326.4c14.4 0 28.8-6.4 38.4-16 9.6-11.2 16-25.6 16-40V928h4.8c16 0 27.2-12.8 27.2-27.2v-57.6c1.6-14.4-8-25.6-20.8-27.2z m-36.8 120c0 16-12.8 28.8-27.2 28.8H552c-14.4 0-27.2-12.8-27.2-28.8V928h382.4l-1.6 8z" fill="#E1E1DF" p-id="1353"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

1
public/img/img4.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655452914322" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1538" width="48" height="48"><path d="M793.6 992H230.4c-70.4 0-128-57.6-128-128V609.6c0-70.4 57.6-128 128-128h564.8c70.4 0 128 57.6 128 128V864c-1.6 70.4-59.2 128-129.6 128z" fill="#E1E1DF" p-id="1539"></path><path d="M937.6 382.4L606.4 68.8c-51.2-49.6-137.6-49.6-188.8 0L86.4 382.4C60.8 406.4 48 438.4 48 470.4V848c0 44.8 38.4 81.6 86.4 81.6h755.2c48 0 86.4-36.8 86.4-81.6V470.4c0-32-12.8-64-38.4-88z" fill="#4E8DF6" p-id="1540"></path><path d="M718.4 931.2H294.4c-70.4 0-128-57.6-128-128V416c0-70.4 57.6-128 128-128h424c70.4 0 128 57.6 128 128v387.2c0 70.4-57.6 128-128 128z" fill="#FFFFFF" p-id="1541"></path><path d="M472 414.4H294.4c-11.2 0-19.2-8-19.2-19.2v-3.2c0-11.2 8-19.2 19.2-19.2h177.6c11.2 0 19.2 8 19.2 19.2v3.2c0 11.2-9.6 19.2-19.2 19.2zM579.2 496H294.4c-11.2 0-19.2-8-19.2-19.2v-3.2c0-11.2 8-19.2 19.2-19.2h284.8c11.2 0 19.2 8 19.2 19.2v3.2c0 11.2-8 19.2-19.2 19.2z" fill="#4E8DF6" p-id="1542"></path><path d="M292.8 688L49.6 456c-1.6 4.8-1.6 9.6-1.6 14.4V848c0 20.8 8 38.4 20.8 52.8 6.4-4.8 11.2-12.8 17.6-19.2L292.8 688zM937.6 881.6c6.4 6.4 12.8 12.8 17.6 20.8 12.8-14.4 20.8-33.6 20.8-52.8V470.4c0-6.4 0-12.8-1.6-20.8L728 684.8l209.6 196.8z" fill="#629FF9" p-id="1543"></path><path d="M728 684.8l-121.6-115.2c-51.2-49.6-137.6-49.6-188.8 0L292.8 688 86.4 881.6c-6.4 6.4-11.2 14.4-17.6 20.8 16 17.6 38.4 28.8 64 28.8h755.2c25.6 0 49.6-11.2 64-28.8-4.8-8-11.2-14.4-17.6-20.8L728 684.8z" fill="#2166CC" p-id="1544"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

1
public/img/img5.svg Normal file
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="1598175718631" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8396" width="200" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M879.616 768.135l-86.299-253.268-3.192-9.367-6.277-18.41-3.543-10.408-5.922-17.408v60.037l5.922 17.408 3.543 10.407 6.277 18.41 3.192 9.368 67.457 197.986c1.077 3.182-1.056 6.51-4.778 7.437l-62.668 15.613-3.193 0.797-6.276 1.563-3.543 0.877-5.923 1.478v17.478l5.923-1.482 3.543-0.877 6.276-1.564 3.193-0.797 68.179-16.979a26.29 26.29 0 0 0 15.922-10.936 19.894 19.894 0 0 0 2.187-17.363z m-203.388 56.946l-32.46 8.098-32.462 8.094-31.808 7.922-33.69 8.385-33.677 8.396-109.35 27.239c-3.721 0.921-7.606-0.908-8.698-4.08l-7.884-23.132-2.868-8.397-2.854-8.382-2.705-7.924-5.41-16.186h-20.618l5.41 16.186 2.705 7.924 2.854 8.382 2.855 8.39 9.466 27.838a23.897 23.897 0 0 0 12.843 13.62 30.72 30.72 0 0 0 20.35 1.827l174.03-43.344 33.69-8.396 33.69-8.389 31.795-7.885 64.922-16.192zM257.867 262.554l-9.47 2.313-3.462 0.868-9.83 2.488-9.82 2.45-31.975 7.957c-14.113 3.532-22.221 16.162-18.138 28.243l50.042 147.066 9.89 28.822 9.804 28.797 3.463 10.163 9.466 27.757 9.471 27.75v-59.932l-9.47-27.75-9.467-27.757-3.437-10.24-9.83-28.797-9.82-28.809-31.254-91.76c-1.078-3.175 1.06-6.501 4.771-7.434l26.484-6.594 9.82-2.436 9.804-2.458 3.463-0.87 9.466-2.312 9.471-2.314v-17.553z m447.345-6.36l-5.285-15.531-1.354-3.812-0.647-1.895-4.916-14.412-0.135-0.392-4.054-12.098-0.19-0.54-8.952-26.289c-4.145-12.058-18.911-18.984-33.031-15.497l-167.78 41.794-6.263 1.563-26.265 6.535-7.424 1.848-25.038 6.246h70.167l25.05-6.232 7.423-1.843 26.27-6.547 6.262-1.564 103.074-25.676a8.602 8.602 0 0 1 1.979-0.243 6.972 6.972 0 0 1 6.758 4.336l7.318 21.577 0.528 1.563 1.35 4.072 0.284 0.81 0.558 1.666 0.633 1.843 1.53 4.478 0.608 1.754 0.732 2.15 0.891 2.616 4.898 14.365 4.693 13.792-0.085-19.174 2.451 2.626 3.488 3.734 12.052 12.943 4.059 4.37z m0 0" fill="#e6e6e6" p-id="8397"></path><path d="M793.317 327.9v491.402c0 12.137-11.507 21.973-25.702 21.973H274.099c-14.193 0-25.702-9.836-25.702-21.973V229.5c0-12.137 11.509-21.977 25.702-21.977h414.708v16.191H274.099a7.373 7.373 0 0 0-4.787 1.696 5.388 5.388 0 0 0-1.983 4.09v589.803c0 3.191 3.029 5.78 6.766 5.78h493.517a7.386 7.386 0 0 0 4.783-1.69 5.392 5.392 0 0 0 1.983-4.09V325.161h16.384z m0 0" fill="#e6e6e6" p-id="8398"></path><path d="M793.696 328.237l-0.313-0.337-2.56-2.739-86.393-92.681-11.483-12.328-2.546-2.73-0.403-0.44-1.127-1.154v-0.059l-0.11-0.116-0.079-0.094a13.49 13.49 0 0 0-8.873-4.067 13.878 13.878 0 0 0-2.222 0 15.064 15.064 0 0 0-3.149 0.574 13.323 13.323 0 0 0-3.993 1.946 11.924 11.924 0 0 0-1.844 1.653 9.897 9.897 0 0 0-2.704 6.739v1.307l0.497 110.687c0.046 5.98 5.685 10.825 12.675 10.893l36.194 0.234 8.021 0.056h2.216l10.24 0.08h7.318l31.391 0.205 9.157 0.06h0.314c4.848-0.09 9.216-2.513 11.285-6.262a9.66 9.66 0 0 0-1.521-11.433z m-56.171 1.24h-27.863l-24.428-0.163-0.323-72.499-0.08-19.173 2.447 2.623 3.492 3.736 12.05 12.941 4.056 4.372 11.484 12.13 52.428 56.252zM443.47 358.911h-90.089a23.202 23.202 0 0 0-23.265 23.08v89.406a23.202 23.202 0 0 0 23.265 23.08h90.09a23.211 23.211 0 0 0 23.275-23.08V381.99a23.211 23.211 0 0 0-23.275-23.08z m61.258 6.872H713.61v20.8H504.73z m0 101.023H713.61v20.8H504.73zM330.116 574.706h381.707v20.8H330.116z m-1.27 101.007h383.487v20.8H328.845z m0 0" fill="#e6e6e6" p-id="8399"></path><path d="M358.725 376.182h82.86q10.342 0 10.342 9.743v78.103q0 9.741-10.342 9.743h-82.86q-10.343 0-10.343-9.743v-78.103q0-9.742 10.343-9.743z m0 0" fill="#e6e6e6" p-id="8400"></path><path d="M360.67 382.944h74.188q12.288 0 12.288 12.288v74.188q0 12.288-12.288 12.288H360.67q-12.288 0-12.288-12.288v-74.188q0-12.288 12.288-12.288z" fill="#e6e6e6" p-id="8401"></path></svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
public/img/jdt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
public/img/jdt1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/img/lq1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

1
public/img/null.svg Normal file
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="1598175718631" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8396" width="200" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M879.616 768.135l-86.299-253.268-3.192-9.367-6.277-18.41-3.543-10.408-5.922-17.408v60.037l5.922 17.408 3.543 10.407 6.277 18.41 3.192 9.368 67.457 197.986c1.077 3.182-1.056 6.51-4.778 7.437l-62.668 15.613-3.193 0.797-6.276 1.563-3.543 0.877-5.923 1.478v17.478l5.923-1.482 3.543-0.877 6.276-1.564 3.193-0.797 68.179-16.979a26.29 26.29 0 0 0 15.922-10.936 19.894 19.894 0 0 0 2.187-17.363z m-203.388 56.946l-32.46 8.098-32.462 8.094-31.808 7.922-33.69 8.385-33.677 8.396-109.35 27.239c-3.721 0.921-7.606-0.908-8.698-4.08l-7.884-23.132-2.868-8.397-2.854-8.382-2.705-7.924-5.41-16.186h-20.618l5.41 16.186 2.705 7.924 2.854 8.382 2.855 8.39 9.466 27.838a23.897 23.897 0 0 0 12.843 13.62 30.72 30.72 0 0 0 20.35 1.827l174.03-43.344 33.69-8.396 33.69-8.389 31.795-7.885 64.922-16.192zM257.867 262.554l-9.47 2.313-3.462 0.868-9.83 2.488-9.82 2.45-31.975 7.957c-14.113 3.532-22.221 16.162-18.138 28.243l50.042 147.066 9.89 28.822 9.804 28.797 3.463 10.163 9.466 27.757 9.471 27.75v-59.932l-9.47-27.75-9.467-27.757-3.437-10.24-9.83-28.797-9.82-28.809-31.254-91.76c-1.078-3.175 1.06-6.501 4.771-7.434l26.484-6.594 9.82-2.436 9.804-2.458 3.463-0.87 9.466-2.312 9.471-2.314v-17.553z m447.345-6.36l-5.285-15.531-1.354-3.812-0.647-1.895-4.916-14.412-0.135-0.392-4.054-12.098-0.19-0.54-8.952-26.289c-4.145-12.058-18.911-18.984-33.031-15.497l-167.78 41.794-6.263 1.563-26.265 6.535-7.424 1.848-25.038 6.246h70.167l25.05-6.232 7.423-1.843 26.27-6.547 6.262-1.564 103.074-25.676a8.602 8.602 0 0 1 1.979-0.243 6.972 6.972 0 0 1 6.758 4.336l7.318 21.577 0.528 1.563 1.35 4.072 0.284 0.81 0.558 1.666 0.633 1.843 1.53 4.478 0.608 1.754 0.732 2.15 0.891 2.616 4.898 14.365 4.693 13.792-0.085-19.174 2.451 2.626 3.488 3.734 12.052 12.943 4.059 4.37z m0 0" fill="#e6e6e6" p-id="8397"></path><path d="M793.317 327.9v491.402c0 12.137-11.507 21.973-25.702 21.973H274.099c-14.193 0-25.702-9.836-25.702-21.973V229.5c0-12.137 11.509-21.977 25.702-21.977h414.708v16.191H274.099a7.373 7.373 0 0 0-4.787 1.696 5.388 5.388 0 0 0-1.983 4.09v589.803c0 3.191 3.029 5.78 6.766 5.78h493.517a7.386 7.386 0 0 0 4.783-1.69 5.392 5.392 0 0 0 1.983-4.09V325.161h16.384z m0 0" fill="#e6e6e6" p-id="8398"></path><path d="M793.696 328.237l-0.313-0.337-2.56-2.739-86.393-92.681-11.483-12.328-2.546-2.73-0.403-0.44-1.127-1.154v-0.059l-0.11-0.116-0.079-0.094a13.49 13.49 0 0 0-8.873-4.067 13.878 13.878 0 0 0-2.222 0 15.064 15.064 0 0 0-3.149 0.574 13.323 13.323 0 0 0-3.993 1.946 11.924 11.924 0 0 0-1.844 1.653 9.897 9.897 0 0 0-2.704 6.739v1.307l0.497 110.687c0.046 5.98 5.685 10.825 12.675 10.893l36.194 0.234 8.021 0.056h2.216l10.24 0.08h7.318l31.391 0.205 9.157 0.06h0.314c4.848-0.09 9.216-2.513 11.285-6.262a9.66 9.66 0 0 0-1.521-11.433z m-56.171 1.24h-27.863l-24.428-0.163-0.323-72.499-0.08-19.173 2.447 2.623 3.492 3.736 12.05 12.941 4.056 4.372 11.484 12.13 52.428 56.252zM443.47 358.911h-90.089a23.202 23.202 0 0 0-23.265 23.08v89.406a23.202 23.202 0 0 0 23.265 23.08h90.09a23.211 23.211 0 0 0 23.275-23.08V381.99a23.211 23.211 0 0 0-23.275-23.08z m61.258 6.872H713.61v20.8H504.73z m0 101.023H713.61v20.8H504.73zM330.116 574.706h381.707v20.8H330.116z m-1.27 101.007h383.487v20.8H328.845z m0 0" fill="#e6e6e6" p-id="8399"></path><path d="M358.725 376.182h82.86q10.342 0 10.342 9.743v78.103q0 9.741-10.342 9.743h-82.86q-10.343 0-10.343-9.743v-78.103q0-9.742 10.343-9.743z m0 0" fill="#e6e6e6" p-id="8400"></path><path d="M360.67 382.944h74.188q12.288 0 12.288 12.288v74.188q0 12.288-12.288 12.288H360.67q-12.288 0-12.288-12.288v-74.188q0-12.288 12.288-12.288z" fill="#e6e6e6" p-id="8401"></path></svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
public/img/pin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
public/img/sjhy1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/img/sjhy2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
public/img/sjhy3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/img/sjhy4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
public/img/sjkf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

BIN
public/img/sjsy1.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
public/img/sl.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 B

BIN
public/img/sygl1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
public/img/tb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
public/img/tb1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

1
public/img/tb1.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655453460466" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1266" width="32" height="32"><path d="M825.088 187.84c83.968 83.968 127.424 189.888 130.368 317.632-2.944 127.744-46.4 233.6-130.368 317.632s-189.888 127.424-317.632 130.368c-127.744-2.944-233.6-46.4-317.632-130.368S62.4 633.216 59.456 505.472c2.944-127.744 46.4-233.6 130.368-317.632S379.712 60.416 507.456 57.472c127.744 2.944 233.664 46.4 317.632 130.368z m-118.976 432.704c8.192-8.448 12.224-19.072 12.224-31.936 0-12.8-4.096-23.488-12.224-31.936-8.192-8.448-18.944-12.672-32.384-12.672H335.104c-6.976 0-14.272 1.92-21.888 5.696-7.616 3.776-13.12 10.496-16.64 20.096s-4.992 18.816-4.352 27.584c0.576 8.768 4.096 16.64 10.496 23.616l115.52 133.888c2.944 3.52 7.296 6.592 13.12 9.216 5.824 2.624 11.968 3.968 18.368 3.968s12.544-1.344 18.368-3.968c5.824-2.624 10.496-5.696 14.016-9.216 9.92-9.92 15.744-20.544 17.472-31.936s-2.048-22.016-11.392-31.936l-50.752-57.728h236.224c13.504-0.064 24.256-4.288 32.448-12.736zM308.864 390.4c-8.192 8.448-12.224 19.136-12.224 31.936 0 12.864 4.096 23.744 12.224 32.832 8.192 9.024 18.944 15.04 32.384 17.92h332.48c6.976 0.576 14.272-1.152 21.888-5.248 7.552-4.096 13.12-10.944 16.64-20.544s4.8-18.816 3.968-27.584-4.224-16.32-10.048-22.72L590.592 262.272c-9.92-9.92-20.544-15.744-31.936-17.472s-22.016 2.048-31.936 11.392c-9.92 6.976-14.848 16.768-14.848 29.312s4.928 24.064 14.848 34.56l50.752 57.728H341.248c-13.44-0.064-24.256 4.16-32.384 12.608z" p-id="1267" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/img/tb2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

1
public/img/tb2.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655453555926" class="icon" viewBox="0 0 1026 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3195" width="32" height="32"><path d="M984.064 904.192H750.592c-39.424 49.664-89.088 90.624-145.92 119.808h378.88c22.016 0 39.936-17.92 39.936-39.936v-39.936c0.512-22.016-17.408-39.936-39.424-39.936z m0-225.792H845.312c-5.12 40.96-15.36 81.408-31.232 119.808h170.496c22.016 0 39.936-17.92 39.936-39.936v-39.936c-0.512-22.528-18.432-39.936-40.448-39.936z m0-226.304H814.08c15.872 38.4 26.624 78.336 31.232 119.808h138.752c22.016 0 39.936-17.92 39.936-39.936v-39.936c0-22.016-17.92-39.936-39.936-39.936z m0-225.792H606.208c56.32 29.184 105.472 70.144 144.896 119.808h232.96c22.016 0 39.936-17.92 39.936-39.936V266.24c0-22.528-17.92-39.936-39.936-39.936z m-584.704-0.512C178.688 225.792 0 404.48 0 624.64S178.688 1024 399.36 1024s399.36-178.688 399.36-399.36-179.2-398.848-399.36-398.848zM524.8 619.52v36.352h-90.624l-0.512 0.512v45.568H524.8v36.352h-91.136v82.432h-69.12v-82.432H273.92v-36.352h90.624v-45.568l-0.512-0.512H273.92V619.52h69.632l-104.96-190.976h77.824L399.36 593.92l82.944-165.376h77.824L454.656 619.52H524.8z" p-id="3196" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/img/tb3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

1
public/img/tb3.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655453502816" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2198" width="32" height="32"><path d="M801.28 287.744L870.4 51.2l-204.8 51.2-153.6-102.4-153.6 102.4-204.8-51.2 69.12 236.544A307.2 307.2 0 0 0 51.2 563.2v358.4a102.4 102.4 0 0 0 102.4 102.4h716.8a102.4 102.4 0 0 0 102.4-102.4v-358.4a307.2 307.2 0 0 0-171.52-275.456zM716.8 665.6h-153.6v51.2h153.6v102.4h-153.6v102.4H460.8v-102.4H307.2v-102.4h153.6v-51.2H307.2v-102.4h104.96L330.752 481.792 403.456 409.6 512 518.144 620.544 409.6l72.192 72.192L611.84 563.2H716.8z" p-id="2199" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 621 B

BIN
public/img/tb4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

1
public/img/tb4.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655453612054" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4949" width="32" height="32"><path d="M149.065143 121.709714h728.429714c25.014857 0 45.568-18.651429 45.568-41.398857 0-22.674286-20.48-41.545143-45.568-41.545143h-728.502857c-25.014857 0-45.568 18.578286-45.568 41.325715 0.146286 22.893714 20.553143 41.691429 45.641143 41.691428z m276.041143 377.490286h1.462857-1.462857z m524.288-294.253714H74.605714a46.153143 46.153143 0 0 0-45.568 46.226285v689.956572c0 25.526857 20.48 46.299429 45.568 46.299428h874.788572a46.153143 46.153143 0 0 0 45.568-46.299428V251.172571a46.08 46.08 0 0 0-45.568-46.226285zM662.089143 638.537143c25.014857 0 45.568 18.578286 45.568 41.325714 0 22.747429-20.48 41.398857-45.568 41.398857H552.886857v100.205715c0 25.526857-18.358857 46.299429-40.740571 46.299428-22.454857 0-40.813714-20.918857-40.813715-46.299428V721.408h-108.982857c-25.088 0-45.641143-18.651429-45.641143-41.398857 0-22.747429 20.48-41.398857 45.568-41.398857h108.982858v-59.611429h-108.982858c-25.014857 0-45.568-18.651429-45.568-41.398857 0-22.674286 20.48-41.398857 45.568-41.398857h60.342858l-22.381715-43.300572-26.404571-51.273142c-11.556571-22.674286-4.900571-49.590857 14.994286-60.269715 19.894857-10.605714 45.714286-0.731429 57.344 21.650286l21.211428 41.106286 1.170286 1.974857 21.869714 42.276571h0.219429l22.162285 42.861715 22.162286-42.861715h0.219429l21.869714-42.276571c0.292571-0.804571 0.731429-1.462857 1.097143-1.974857l21.211428-41.179429c11.629714-22.601143 37.449143-32.182857 57.417143-21.577143 19.894857 10.678857 26.624 37.595429 14.994286 60.269715l-26.404571 51.273142-22.381715 43.300572H602.697143h59.392c25.014857 0 45.641143 18.651429 45.641143 41.398857 0 22.674286-20.48 41.398857-45.641143 41.398857H552.813714v59.392h109.275429v0.146286z" p-id="4950" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
public/img/tb5.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655453667289" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6809" width="32" height="32"><path d="M182.9 92.4h239.5c27.9 0.9 55.4 12 75.8 31.2 20.4 18.8 33.7 45.2 36.5 72.9 1.2 12.1 0.5 24.3 0.7 36.5h281.5c11.5 0.1 23.1-0.4 34.6 0.9 28.6 3.2 55.7 17.7 74.4 39.6 17.3 19.8 27.2 45.6 28.2 71.8v473.6c-0.8 18.3-5.6 36.4-14.6 52.4-16.5 29.9-46.7 51.9-80.4 57.9-7.1 1.6-14.4 1.4-21.6 2.5H188.1c-5.1-0.9-10.3-0.6-15.5-1.3-16.6-1.9-32.8-7.5-47.1-16.3-23-14-40.8-36.3-49.5-61.8-4.5-13-6.3-26.9-6.3-40.7V211.5c0.1-8.7 0.6-17.3 2.4-25.8 5.3-26.8 20.5-51.4 41.9-68.2 19.5-15.6 44.1-24.3 68.9-25.1m96.5 291.4c-10.3 1.9-18.6 11.5-18.8 22-0.5 9.4 5.6 18.6 14.3 22.1 5.9 2.6 12.5 1.6 18.7 1.8H740c9.9 0.1 19.4-6.6 22.3-16.1 3-8.7-0.1-19-7.2-24.8-4.2-3.6-9.7-5.4-15.1-5.4H289.3c-3.3 0-6.6-0.2-9.9 0.4m1.5 174.3c-8.6 0.9-16.3 7.2-19 15.4-4 10.7 1.5 23.8 11.9 28.5 5.9 3.1 12.6 2.1 19 2.3H741c11.2 0 21.3-9.3 22.4-20.4 1.9-12.9-9.3-25.9-22.4-25.8-153.4 0-306.7-0.3-460.1 0m0.9 174.4c-10.4 0.7-19.4 9.3-20.9 19.5-1.1 7.3 1.4 15 6.7 20 4.5 4.6 11 6.8 17.4 6.7h449.1c5.1 0 10.5 0.2 15.2-1.9 7-2.9 12.4-9.5 13.8-16.9 1.7-8.1-1.5-16.9-7.9-22.1-4.4-3.7-10.2-5.7-16-5.4-152.5 0.1-305-0.1-457.4 0.1z" p-id="6810" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

1
public/img/tb6.svg Normal file
View File

@@ -0,0 +1 @@
<svg t="1655453721184" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9429" width="32" height="32"><path d="M736.083 467.183H287.917v89.633h448.166v-89.633z m89.633-313.716h-44.817V63.834h-89.633v89.633H332.734V63.834h-89.633v89.633h-44.817c-49.746 0-89.185 40.335-89.185 89.633l-0.448 627.432c0 49.298 39.887 89.633 89.633 89.633h627.432c49.298 0 89.633-40.335 89.633-89.633V243.101c0-49.299-40.335-89.634-89.633-89.634z m0 717.066H198.284V377.55h627.432v492.983zM601.633 646.45H287.917v89.633h313.716V646.45z" fill="#ffffff" p-id="9430"></path></svg>

After

Width:  |  Height:  |  Size: 597 B

BIN
public/img/time.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 B

BIN
public/img/user.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 B

BIN
public/img/whitefyzd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/img/whitehyzm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
public/img/whitelltz.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
public/img/whitesptg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/img/wxxcx1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
public/img/xc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

1
public/img/xm.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

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