init:初始化
@ -0,0 +1,12 @@
|
||||
.git
|
||||
.gitignore
|
||||
.husky
|
||||
.github
|
||||
node_modules
|
||||
dist
|
||||
coverage
|
||||
.DS_Store
|
||||
npm-debug.log*
|
||||
pnpm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
@ -0,0 +1,2 @@
|
||||
*.html linguist-detectable=false
|
||||
*.vue linguist-detectable=true
|
||||
@ -0,0 +1,26 @@
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
.cursorrules
|
||||
.history
|
||||
|
||||
# Auto-generated files
|
||||
src/types/import/auto-imports.d.ts
|
||||
src/types/import/components.d.ts
|
||||
.auto-import.json
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.local
|
||||
|
||||
stats.html
|
||||
.stylelintcache
|
||||
.eslintcache
|
||||
|
||||
# docs and app directories are at frontend root, managed by frontend/.gitignore
|
||||
@ -0,0 +1 @@
|
||||
pnpm dlx commitlint --edit $1
|
||||
@ -0,0 +1 @@
|
||||
pnpm run lint:lint-staged
|
||||
@ -0,0 +1,11 @@
|
||||
node_modules/
|
||||
dist/
|
||||
public/
|
||||
.vscode/
|
||||
src/types/import/
|
||||
.auto-import.json
|
||||
pnpm-lock.yaml
|
||||
package-lock.json
|
||||
.stylelintcache
|
||||
.eslintcache
|
||||
stats.html
|
||||
@ -0,0 +1,11 @@
|
||||
dist
|
||||
node_modules
|
||||
public
|
||||
.husky
|
||||
.vscode
|
||||
.idea
|
||||
*.sh
|
||||
*.md
|
||||
|
||||
src/assets
|
||||
stats.html
|
||||
@ -0,0 +1,650 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Released]
|
||||
|
||||
### v3.0.1 - 2025-11-15
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed repeated API calls issue when accessing non-existent interfaces during route registration
|
||||
- Fixed one-click cleanup script build failure issue
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Enhanced route configuration validation mechanism, automatically detects and prompts path configuration errors for non-first-level menus
|
||||
- Optimized top progress bar ghosting issue
|
||||
- Optimized vite pre-build configuration
|
||||
- Unified border radius and border consistency
|
||||
- Redesigned lock screen page, improved visual experience
|
||||
- Optimized visual experience issue caused by logout menu disappearing prematurely
|
||||
|
||||
#### Added
|
||||
|
||||
- FaForm and FaSearchBar component labels support custom render functions, enabling complex labels with tooltips
|
||||
- Menu management form key fields added Tooltip hints, lowering user configuration threshold
|
||||
- Iconify added offline icon loading mode
|
||||
- Logout added redirect property for redirecting to corresponding page after re-login
|
||||
- Logout and re-entry preserves user tabs, identified by userId
|
||||
- Dual menu added collapse button
|
||||
- Enhanced menu icons
|
||||
- Multi-tab pages added icon display
|
||||
- Added WebSocket connection example
|
||||
- Lock screen password error triggers input box shake animation
|
||||
|
||||
#### ⚠️ Important Notice
|
||||
|
||||
> This version requires re-login
|
||||
|
||||
---
|
||||
|
||||
### v3.0.0 - 2025-11-09 🎉
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Style system refactored: Sass fully migrated to Tailwind CSS, improving development efficiency and style consistency
|
||||
- Icon solution upgraded: Iconfont replaced with Iconify, supporting richer icon libraries and on-demand loading
|
||||
- Route registration refactored: Comprehensive refactoring of route registration system with object-oriented design, improving code maintainability, testability and extensibility
|
||||
- Refactored ArtTextScroll component, improving performance and maintainability
|
||||
- Refactored color system, unified UI visual specifications, improving interface consistency
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Build optimization: Complete package size reduced by 1.3 MB, significantly improving loading performance
|
||||
- Architecture optimization: Optimized directory structure with clearer responsibility division, reducing user learning curve and onboarding difficulty
|
||||
- Comment optimization: Unified module comment standards, improved component descriptions, feature explanations and usage examples, reducing user understanding cost and onboarding difficulty
|
||||
- Performance improvement: Optimized core code logic, improving system runtime efficiency
|
||||
- Menu optimization: Refined menu styles, optimized interaction experience and visual presentation
|
||||
- Responsive optimization: Optimized FaForm and FaSearchBar grid layout, adapting to various screen sizes
|
||||
- Configuration management optimization: Added setting.ts configuration file, supporting one-click copy and reset of system default settings
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed FaForm and FaSearchBar custom component rendering issues
|
||||
|
||||
#### Added
|
||||
|
||||
- FaForm and FaSearchBar added render property, supporting custom component rendering
|
||||
- Festival feature enhancement: Fireworks configuration supports cross-date range settings and custom playback counts
|
||||
|
||||
#### Upgraded
|
||||
|
||||
- Dependency updates: Upgraded core dependencies to latest stable versions
|
||||
|
||||
#### ⚠️ Important Notice
|
||||
|
||||
> This upgrade involves fundamental refactoring of the style system (Sass → Tailwind CSS) and icon library (Iconfont → Iconify), which is a breaking change. It is recommended to use v3.0 for new projects. Upgrading existing projects is not recommended.
|
||||
|
||||
---
|
||||
|
||||
### v2.6.1 - 2025-10-19
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed repeated API calls issue when accessing invalid addresses for user info and menu endpoints
|
||||
- Fixed ElButton circle mode styles
|
||||
- Fixed ElSelect keyboard selection issue
|
||||
- Fixed static routes with parameters redirecting to login page issue
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Upgraded some dependencies to be compatible with tailwindcss
|
||||
- Optimized external link menu click selection state
|
||||
- Added theme color switching feature to authorization pages
|
||||
|
||||
---
|
||||
|
||||
### v2.6.0 - 2025-10-16
|
||||
|
||||
#### Added
|
||||
|
||||
- Extended registration and password reset page top component support
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Optimized streamlined version menu data structure, improved data consistency
|
||||
- Optimized local development environment network request proxy configuration
|
||||
- Optimized ElTree component default styles
|
||||
- Added VsCode recommended plugin related configuration
|
||||
- Optimized ElDropdown component click trigger mode interaction styles
|
||||
- Optimized menu filtering logic
|
||||
- Optimized page switching animation, improved loading speed
|
||||
- Optimized dark mode text color
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed static route custom home page path first visit redirecting to login page issue
|
||||
- Fixed logout briefly jumping to 500 page issue
|
||||
- Fixed v2.5.9 version home route redirect configuration failure issue
|
||||
- Fixed v2.5.9 auto-import mechanism causing build exception
|
||||
|
||||
#### ⚠️ Important Notice
|
||||
|
||||
> This version requires re-login
|
||||
|
||||
---
|
||||
|
||||
### v2.5.9 - 2025-10-12
|
||||
|
||||
#### Code Optimized
|
||||
|
||||
- Optimized views file directory, file names, and code
|
||||
- Added global configuration for useTable pagination request fields (tableConfig.ts)
|
||||
- Optimized routing configuration to modular structure
|
||||
- Menu API now uses apifox mock data (set VITE_ACCESS_MODE to backend mode in .env)
|
||||
|
||||
---
|
||||
|
||||
### v2.5.8 - 2025-09-29
|
||||
|
||||
#### Upgraded
|
||||
|
||||
- Upgraded core libraries including vue, vite, element-plus
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed rich text editor fullscreen top bar z-index issue
|
||||
- Fixed table column sorting component text overflow issue
|
||||
- Fixed statistics card condition judgment
|
||||
- Fixed infinite redirect when root path / and HOME_PAGE_PATH are both /
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Optimized el-tag styles
|
||||
- Optimized top progress bar color
|
||||
- Optimized custom theme configuration
|
||||
- Optimized ElementPlus custom theme issues
|
||||
|
||||
#### ⚠️ Important Notice
|
||||
|
||||
> Due to dependency upgrades, Node version needs to be upgraded to v20.19.0 or above
|
||||
|
||||
---
|
||||
|
||||
### v2.5.7 - 2025-09-14
|
||||
|
||||
#### Added
|
||||
|
||||
- Added FaForm component
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed theme switching flicker issue in new Chrome versions
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Optimized form label height alignment issue
|
||||
- First screen startup performance optimization
|
||||
|
||||
---
|
||||
|
||||
### v2.5.6 - 2025-09-06
|
||||
|
||||
#### Added
|
||||
|
||||
- FaTableHeader added search button to control top search bar visibility
|
||||
- Added permission demonstration examples
|
||||
- Added global error handling framework
|
||||
|
||||
#### Optimized
|
||||
|
||||
- useTable type inference optimization, no need to manually pass types for type hints
|
||||
- useTable removeColumn supports multiple data deletion
|
||||
- useTable auto-recognizes response body with custom configuration (src/utils/table/tableConfig.ts)
|
||||
- useTable empty data browser warning optimization
|
||||
- API request code optimization, api.d.ts type optimization
|
||||
- Optimized FaTable top button wrapping adaptive issue
|
||||
- FaTable pagination component selection style optimization
|
||||
- FaTable empty state height fills by default
|
||||
- ArtButtonMore component added icon and color configuration
|
||||
- FaSearchBar label doesn't occupy space when empty
|
||||
- Table operation column drag prohibits fixed column dragging
|
||||
- Role management page API integration and code optimization
|
||||
- Menu management page optimization
|
||||
- Optimized settings center scroll following issue
|
||||
- First-level route external link component validation logic optimization
|
||||
- Optimized map bottom-right drag issue
|
||||
- Optimized dark mode page refresh white background issue
|
||||
- Optimized left menu collapse button spacing issue
|
||||
- Mobile displays left menu logo
|
||||
- Network request added showSuccessMessage to configure success message display
|
||||
- Global components use async loading strategy to improve first screen loading performance
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed bug where batch deleting entire page data doesn't return to previous page
|
||||
- Fixed dynamic route parameter issues
|
||||
- Fixed dynamic route configuration first-level route iframe page fullscreen issue
|
||||
|
||||
---
|
||||
|
||||
### v2.5.5 - 2025-08-17
|
||||
|
||||
#### Added
|
||||
|
||||
- Added FaSearchBar component examples
|
||||
- useTable added excludeParams to exclude certain parameters from requests
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Refactored FaSearchBar component, supports more components and form validation
|
||||
|
||||
#### Optimized
|
||||
|
||||
- useTable column configuration: supports dynamic update capability
|
||||
- Optimized color picker border radius
|
||||
- Unified el-radio and el-checkbox sizes
|
||||
- art-stats-card added decimal places and separator configuration
|
||||
- Route configuration example optimization
|
||||
- Advanced table added custom data fetching example
|
||||
- Optimized path alias type issues
|
||||
- Local development CORS configuration optimization
|
||||
- useTable property and method naming optimization
|
||||
- Login page UI upgrade
|
||||
- 403, 404, 500 page UI upgrade
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed multiple rich text editor icon inconsistency issue
|
||||
- Fixed useTable deleting last entire page data not returning to previous page issue
|
||||
- Fixed echarts chart data initialization and update browser error
|
||||
- Network request supports logout on HTTP status code 401
|
||||
- Optimized network request logout multiple prompt issue
|
||||
|
||||
#### Removed
|
||||
|
||||
- Removed art-chart-empty component
|
||||
|
||||
---
|
||||
|
||||
### v2.5.4 - 2025-07-27
|
||||
|
||||
#### Added
|
||||
|
||||
- Network request headers support custom configuration
|
||||
- Expand row supports formatter rendering
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Route registration added component validation
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed user info API timing issue causing route registration menu rendering error
|
||||
- Fixed dynamic route validation issue causing iframe not to display
|
||||
- Fixed reset file syntax error
|
||||
- Fixed FaTable data type error
|
||||
- Fixed map scroll wheel zoom issue
|
||||
|
||||
---
|
||||
|
||||
### v2.5.3 - 2025-07-20
|
||||
|
||||
#### Added
|
||||
|
||||
- Added table left-right layout example
|
||||
|
||||
#### Refactored
|
||||
|
||||
- FaTable component refactored
|
||||
|
||||
#### Upgraded
|
||||
|
||||
- Element Plus upgraded to v2.10.2
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Optimized useTable pagination parameter issue
|
||||
- Optimized network request example: initialization parameters, pagination carrying parameters
|
||||
- Optimized search date range parameter handling
|
||||
- Optimized el-date-picker component border radius
|
||||
- Optimized el-select component hover style
|
||||
- Search component and pagination component height reduced
|
||||
- Optimized login page slider animation interval
|
||||
- Optimized menu without submenu display issue
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed FaTable switching page size executing two requests bug
|
||||
|
||||
---
|
||||
|
||||
### v2.5.2 - 2025-07-13
|
||||
|
||||
#### Added
|
||||
|
||||
- Added one-click cleanup script for quick development environment preparation
|
||||
- useTable hooks support custom pagination field name mapping
|
||||
- Horizontal menu, mixed menu, double column menu support badge display
|
||||
- Quick entry supports configuration file mode
|
||||
- Top bar function supports configuration file mode
|
||||
- Support custom home page path
|
||||
- Route supports redirect and other attributes configuration
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Global event bus mittBus type safety optimization
|
||||
- Optimized mobile settings container width style
|
||||
- Optimized login page verification slider text centering effect
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed table no data header not displaying issue
|
||||
- Fixed v2.5.0 top progress bar not displaying issue
|
||||
- Fixed left menu mask abnormal display issue
|
||||
- Fixed hiding all submenus still showing parent menu issue
|
||||
- Fixed stylelint causing login page slider style abnormality
|
||||
- Fixed old mobile device loading positioning issue
|
||||
|
||||
---
|
||||
|
||||
### v2.5.1 - 2025-07-08
|
||||
|
||||
#### Optimized
|
||||
|
||||
- el-card and el-table background color consistent with system
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed first login system loading closing early bug
|
||||
- Fixed v2.5.0 version causing fullscreen page style z-index too low bug
|
||||
- Fixed v2.5.0 version causing table expand row collapse bug
|
||||
|
||||
---
|
||||
|
||||
### v2.5.0 - 2025-07-06 🎉
|
||||
|
||||
#### Added
|
||||
|
||||
- Added useTable hooks table encapsulation, supports data fetching, transformation, response adaptation, intelligent caching (based on LRU algorithm), error handling, column configuration and slots, pagination control, refresh strategies and other core functions, comprehensively improving development efficiency and user experience
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Refactored FaTable, FaTableHeader, ArtNotification components
|
||||
|
||||
#### Upgraded
|
||||
|
||||
- Echarts version upgraded to 5.6.0
|
||||
|
||||
#### Removed
|
||||
|
||||
- Removed CountTo plugin, replaced with FaCountTo component
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed menu management search directly modifying pinia data issue
|
||||
- Fixed route guard loading flicker issue
|
||||
|
||||
#### ⚠️ Important Notice
|
||||
|
||||
> Recommended upgrade for more efficient and intelligent table development experience
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.9 - 2025-07-02
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Menu layout and top navigation code refactored
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Optimized mobile menu scroll user experience
|
||||
- Optimized top menu style issues
|
||||
- Top menu width adaptive, can display more content, mixed menu supports mouse scroll
|
||||
- asyncRoutes route configuration auth_mark field changed to authMark
|
||||
- Removed duplicate components.d.ts file, components.d.ts and auto-imports.d.ts ignored from commits
|
||||
- Optimized i18n language file loading method, changed from async to sync mode
|
||||
- Optimized el-pagination size inconsistency issue
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed mobile lock screen page some browsers unable to unlock bug
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.8 - 2025-06-26
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed v2.4.2.7 version accessing / path showing 404 issue
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.7 - 2025-06-25
|
||||
|
||||
#### Added
|
||||
|
||||
- Route supports fullscreen mode configuration
|
||||
- Route supports auto-jump to first valid route of menu
|
||||
- Dynamic route added removeAllDynamicRoutes method for completely clearing all dynamic routes
|
||||
- Permission custom directive optimization, added role permission directive v-roles for controlling element visibility
|
||||
- Added tab operation examples
|
||||
|
||||
#### Optimized
|
||||
|
||||
- CORS request carrying cookie configuration from environment variables, disabled by default
|
||||
- Some optimizations for SEO and accessibility
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed login page drag component FaDragVerify width and color abnormal bug
|
||||
- Fixed iframe page mixed mode and double column mode abnormal bug
|
||||
- Optimized lock screen page being penetrated by el-loading bug
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.6 - 2025-06-23
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Refactored form-related components in components/core/forms folder, improved maintainability and consistency
|
||||
- Refactored ArtBreadcrumb breadcrumb navigation component, optimized logic structure and styles
|
||||
- Refactored ArtFireworksEffect fireworks effect component, significantly improved rendering performance and animation smoothness
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Optimized ArtChatWindow and ArtFastEnter component code, improved readability and performance
|
||||
|
||||
#### Added
|
||||
|
||||
- README documentation added official website link for easy access to project documentation
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.5 - 2025-06-22
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Refactored chart components, optimized code structure and maintainability
|
||||
- Fine-tuned chart animations and theme color schemes, improved visual consistency
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.4 - 2025-06-18
|
||||
|
||||
#### Refactored
|
||||
|
||||
- FaMenuRight component refactored
|
||||
- Components under components/core/cards refactored, code optimized
|
||||
|
||||
#### Optimized
|
||||
|
||||
- ArtWatermark added type annotations
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.3 - 2025-06-18
|
||||
|
||||
#### Refactored
|
||||
|
||||
- FaResultPage component refactored
|
||||
|
||||
#### Optimized
|
||||
|
||||
- ArtTextScroll component code optimization
|
||||
- FaException component added type hints
|
||||
- FaCutterImg component style optimization, added type definitions
|
||||
- FaVideoPlayer component added type definitions
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.2 - 2025-06-16
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Back to top component refactored
|
||||
- Icon selector component refactored
|
||||
|
||||
#### Changed
|
||||
|
||||
- System Logo component property changes
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2.1 - 2025-06-16
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Banner component refactored and optimized
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed mixed menu first menu nested menu jump bug
|
||||
|
||||
---
|
||||
|
||||
### v2.4.2 - 2025-06-14
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Refactored network request module, enhanced error handling, type safety and multi-language support
|
||||
|
||||
#### Added
|
||||
|
||||
- Route configuration added activePath active menu path property
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Guide and column settings multi-language improvement
|
||||
- Removed invalid code from user list and menu management pages
|
||||
- Updated technical support link
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed mobile search bar unable to scroll, iPad page scroll abnormal issue
|
||||
- Fixed el-dialog enabling draggable property causing custom animation failure issue
|
||||
- Fixed v2.3.0 local storage refactoring causing login, registration page multi-language settings unable to persist issue
|
||||
- Fixed table fixed column not working bug
|
||||
- Fixed infinite redirect when root path / and HOME_PAGE_PATH are both /
|
||||
|
||||
#### ⚠️ Important Notice
|
||||
|
||||
> This version requires re-login
|
||||
|
||||
---
|
||||
|
||||
### v2.4.1.1 - 2025-06-07
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Optimized role management page code
|
||||
- el-dialog visual effect optimization, supports line configuration
|
||||
- System theme mode changed from Light to follow system mode
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed menu management collapse bug
|
||||
- Fixed table empty data height infinitely growing bug
|
||||
|
||||
---
|
||||
|
||||
### v2.4.1 - 2025-06-07
|
||||
|
||||
#### Added
|
||||
|
||||
- Prohibit using developer tools to crack lock screen when locked
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Improved menu operation responsiveness
|
||||
- Page entrance animation time reduced by 0.04s
|
||||
- Echarts chart performance optimization, added visible area initialization, memory leak protection, debounce handling
|
||||
|
||||
#### Fixed
|
||||
|
||||
- Fixed Echarts chart component not displaying in dialog bug
|
||||
|
||||
---
|
||||
|
||||
### v2.4.0 - 2025-06-06 🎉
|
||||
|
||||
#### Refactored
|
||||
|
||||
- Global TypeScript type system refactored, improved type accuracy and maintainability
|
||||
- Refactored utils toolkit, unified utility method structure, enhanced readability and reusability
|
||||
|
||||
#### Added
|
||||
|
||||
- utils added form validation and Cookie operation related utility functions
|
||||
- Page components added defineOptions for explicit component naming
|
||||
- HTTP request added token expiration auto-handling logic, improved security and user experience
|
||||
|
||||
#### Optimized
|
||||
|
||||
- Deleted unused utility modules and invalid resources, streamlined project size
|
||||
- Optimized views page structure, removed redundant page files
|
||||
- Exception page multi-language support, improved internationalization experience
|
||||
- Image resources uniformly converted to webp format, overall resource size reduced by about 50%
|
||||
- Build output reduced by about 1MB, improved loading efficiency
|
||||
|
||||
#### ⚠️ Important Notice
|
||||
|
||||
> This version requires re-login
|
||||
|
||||
---
|
||||
|
||||
## Version Guidelines
|
||||
|
||||
### Version Number Rules
|
||||
|
||||
This project follows [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html):
|
||||
|
||||
- **Major**: Incompatible API changes
|
||||
- **Minor**: Backwards-compatible functionality additions
|
||||
- **Patch**: Backwards-compatible bug fixes
|
||||
|
||||
### Change Types
|
||||
|
||||
- **Added**: New features
|
||||
- **Changed**: Changes to existing functionality
|
||||
- **Deprecated**: Soon-to-be removed features
|
||||
- **Removed**: Removed features
|
||||
- **Fixed**: Bug fixes
|
||||
- **Security**: Security-related fixes
|
||||
- **Optimized**: Performance or experience optimizations
|
||||
- **Refactored**: Code refactoring
|
||||
- **Upgraded**: Dependency upgrades
|
||||
|
||||
### Important Notice Markers
|
||||
|
||||
- 🎉 **Major Update**: Versions with important new features
|
||||
- ⚠️ **Breaking Changes**: Updates requiring special attention for incompatibility
|
||||
- 🔒 **Security Update**: Versions fixing security vulnerabilities
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
If you want to contribute to the project, please check [CONTRIBUTING.md](./CONTRIBUTING.md).
|
||||
|
||||
## License
|
||||
|
||||
[MIT License](./LICENSE)
|
||||
|
||||
---
|
||||
|
||||
**Note**: This changelog starts recording from version v2.4.0. For earlier version history, please check Git commit records.
|
||||
@ -0,0 +1,31 @@
|
||||
FROM node:20.19-alpine AS build
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN corepack enable
|
||||
|
||||
COPY package.json pnpm-lock.yaml .npmrc ./
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
COPY . .
|
||||
|
||||
ARG VITE_BASE_URL=/
|
||||
ARG VITE_APP_BASE_API=/api/v1
|
||||
ARG VITE_APP_WS_ENDPOINT=
|
||||
ENV VITE_BASE_URL=${VITE_BASE_URL} \
|
||||
VITE_APP_BASE_API=${VITE_APP_BASE_API} \
|
||||
VITE_APP_WS_ENDPOINT=${VITE_APP_WS_ENDPOINT}
|
||||
|
||||
RUN pnpm run build
|
||||
|
||||
FROM nginx:1.25-alpine AS runtime
|
||||
|
||||
ENV BACKEND_UPSTREAM=http://fastapiadmin-backend:8001
|
||||
|
||||
COPY nginx/default.conf.template /etc/nginx/templates/default.conf.template
|
||||
COPY --from=build /app/dist /usr/share/nginx/html
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
||||
CMD wget -q --spider http://127.0.0.1/ || exit 1
|
||||
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 SuperManTT
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@ -0,0 +1,8 @@
|
||||
export const BANNER = [
|
||||
`
|
||||
▗▄▄▄▖ ▗▄▖ ▗▄▄▖▗▄▄▄▖▗▄▖ ▗▄▄▖▗▄▄▄▖ ▗▄▖ ▗▄▄▄ ▗▖ ▗▖▗▄▄▄▖▗▖ ▗▖
|
||||
▐▌ ▐▌ ▐▌▐▌ █ ▐▌ ▐▌▐▌ ▐▌ █ ▐▌ ▐▌▐▌ █▐▛▚▞▜▌ █ ▐▛▚▖▐▌
|
||||
▐▛▀▀▘▐▛▀▜▌ ▝▀▚▖ █ ▐▛▀▜▌▐▛▀▘ █ ▐▛▀▜▌▐▌ █▐▌ ▐▌ █ ▐▌ ▝▜▌
|
||||
▐▌ ▐▌ ▐▌▗▄▄▞▘ █ ▐▌ ▐▌▐▌ ▗▄█▄▖▐▌ ▐▌▐▙▄▄▀▐▌ ▐▌▗▄█▄▖▐▌ ▐▌
|
||||
`,
|
||||
].join("\n");
|
||||
@ -0,0 +1,47 @@
|
||||
import type { PluginOption, ResolvedConfig } from "vite";
|
||||
import pc from "picocolors";
|
||||
import { BANNER } from "./banner";
|
||||
|
||||
const { green, blue, bold, dim, cyan, yellow, magenta } = pc;
|
||||
|
||||
const W = 96;
|
||||
const ANSI_RE = new RegExp(String.fromCharCode(27) + "\\[\\d+(;\\d+)*m", "g");
|
||||
const strip = (s: string) => s.replace(ANSI_RE, "");
|
||||
const BANNER_LINES = BANNER.split("\n");
|
||||
const row = (content: string) => {
|
||||
const pad = Math.max(0, W - strip(content).length - 1);
|
||||
return ` ${dim("│")} ${content}${" ".repeat(pad)}${dim("│")}`;
|
||||
};
|
||||
|
||||
function printBanner(env: Record<string, string>, mode: string) {
|
||||
const line = dim("─".repeat(W));
|
||||
console.log(
|
||||
[
|
||||
"",
|
||||
` ${dim("┌")}${line}${dim("┐")}`,
|
||||
row(""),
|
||||
row(`${bold(cyan("fastapiadmin"))} ${bold(magenta(`v${env.VITE_VERSION || "3.0.0"}`))}`),
|
||||
row(""),
|
||||
...BANNER_LINES.map((l) => row(green(l))),
|
||||
row(""),
|
||||
row(`${dim("mode")} ${yellow(env.VITE_APP_ENV || mode)}`),
|
||||
row(`${dim("api")} ${blue(env.VITE_API_BASE_URL || "")}`),
|
||||
row(`${dim("port")} ${cyan(env.VITE_PORT || "")}`),
|
||||
row(""),
|
||||
` ${dim("└")}${line}${dim("┘")}`,
|
||||
"",
|
||||
].join("\n")
|
||||
);
|
||||
}
|
||||
|
||||
export default function vitePluginStart(): PluginOption {
|
||||
return {
|
||||
name: "vite:start-banner",
|
||||
enforce: "pre",
|
||||
|
||||
configResolved(resolvedConfig: ResolvedConfig) {
|
||||
const env = resolvedConfig.env as Record<string, string>;
|
||||
printBanner(env, resolvedConfig.mode);
|
||||
},
|
||||
};
|
||||
}
|
||||
@ -0,0 +1,41 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
client_max_body_size 100m;
|
||||
|
||||
gzip on;
|
||||
gzip_min_length 1k;
|
||||
gzip_comp_level 6;
|
||||
gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api/v1 {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_connect_timeout 300s;
|
||||
proxy_send_timeout 300s;
|
||||
proxy_read_timeout 300s;
|
||||
proxy_pass ${BACKEND_UPSTREAM};
|
||||
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
|
||||
location /static {
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_pass ${BACKEND_UPSTREAM};
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,216 @@
|
||||
{
|
||||
"name": "fastapiadmin",
|
||||
"description": "Vue3 + Vite + TypeScript + Element-Plus 的后台管理模板",
|
||||
"version": "3.0.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"i": "pnpm install",
|
||||
"dev": "vite",
|
||||
"dev:force": "vite --force",
|
||||
"prod": "vite --mode prod",
|
||||
"build": "vue-tsc --noEmit && vite build",
|
||||
"build:pro": "pnpm vite build --mode pro",
|
||||
"build:gitee": "pnpm vite build --mode gitee",
|
||||
"build:dev": "pnpm vite build --mode dev",
|
||||
"build:test": "pnpm vite build --mode test",
|
||||
"serve:pro": "pnpm vite preview --mode pro",
|
||||
"serve:dev": "pnpm vite preview --mode dev",
|
||||
"serve:test": "pnpm vite preview --mode test",
|
||||
"clean": "pnpx rimraf node_modules",
|
||||
"ts:check": "pnpm vue-tsc --noEmit --skipLibCheck",
|
||||
"npm:check": "pnpx npm-check-updates -u",
|
||||
"clean:cache": "pnpx rimraf node_modules/.cache node_modules/.vite",
|
||||
"prepare": "husky",
|
||||
"icon": "esno ./scripts/icon.ts",
|
||||
"preview": "vite preview",
|
||||
"type-check": "vue-tsc --noEmit",
|
||||
"test": "vitest run",
|
||||
"test:watch": "vitest",
|
||||
"lint": "pnpm run lint:eslint && pnpm run lint:prettier && pnpm run lint:stylelint",
|
||||
"lint:eslint": "eslint --cache \"src/**/*.{vue,ts,js}\" --fix",
|
||||
"lint:prettier": "prettier --write \"**/*.{js,cjs,ts,json,tsx,css,less,scss,vue,html,md}\"",
|
||||
"lint:stylelint": "stylelint \"**/*.{css,scss,vue}\" --cache --fix",
|
||||
"lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.cjs",
|
||||
"commit": "git-cz",
|
||||
"clean:dev": "tsx scripts/clean-dev.ts"
|
||||
},
|
||||
"config": {
|
||||
"commitizen": {
|
||||
"path": "node_modules/cz-git"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{js,ts,mjs,mts,tsx}": [
|
||||
"eslint --fix",
|
||||
"prettier --write"
|
||||
],
|
||||
"*.{cjs,json,jsonc}": [
|
||||
"prettier --write"
|
||||
],
|
||||
"*.vue": [
|
||||
"eslint --fix",
|
||||
"stylelint --fix --allow-empty-input",
|
||||
"prettier --write"
|
||||
],
|
||||
"*.{html,htm}": [
|
||||
"prettier --write"
|
||||
],
|
||||
"*.{scss,css,less}": [
|
||||
"stylelint --fix --allow-empty-input",
|
||||
"prettier --write"
|
||||
],
|
||||
"*.{md,mdx}": [
|
||||
"prettier --write"
|
||||
],
|
||||
"*.{yaml,yml}": [
|
||||
"prettier --write"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "^2.3.2",
|
||||
"@iconify-json/line-md": "^1.2.16",
|
||||
"@iconify-json/ri": "^1.2.10",
|
||||
"@iconify-json/svg-spinners": "^1.2.4",
|
||||
"@iconify/vue": "^5.0.1",
|
||||
"@tailwindcss/vite": "^4.3.0",
|
||||
"@vue-flow/background": "^1.3.2",
|
||||
"@vue-flow/controls": "^1.1.3",
|
||||
"@vue-flow/core": "^1.48.1",
|
||||
"@vue-flow/minimap": "^1.5.4",
|
||||
"@vueuse/core": "^13.9.0",
|
||||
"@wangeditor-next/editor": "^5.7.0",
|
||||
"@wangeditor-next/editor-for-vue": "^5.1.14",
|
||||
"animate.css": "^4.1.1",
|
||||
"axios": "^1.16.1",
|
||||
"clipboard": "^2.0.11",
|
||||
"codemirror": "^5.65.21",
|
||||
"codemirror-editor-vue3": "^2.8.0",
|
||||
"crypto-js": "^4.2.0",
|
||||
"dagre": "^0.8.5",
|
||||
"dayjs": "^1.11.20",
|
||||
"dompurify": "^3.4.3",
|
||||
"echarts": "^6.0.0",
|
||||
"element-plus": "~2.13.7",
|
||||
"exceljs": "^4.4.0",
|
||||
"file-saver": "^2.0.5",
|
||||
"highlight.js": "^11.11.1",
|
||||
"js-beautify": "^1.15.4",
|
||||
"markdown-it": "^14.1.0",
|
||||
"markdown-it-highlightjs": "^4.3.0",
|
||||
"mitt": "^3.0.1",
|
||||
"nprogress": "^0.2.0",
|
||||
"ohash": "^2.0.11",
|
||||
"path-browserify": "^1.0.1",
|
||||
"path-to-regexp": "^8.4.2",
|
||||
"picocolors": "^1.1.1",
|
||||
"pinia": "^3.0.4",
|
||||
"pinia-plugin-persistedstate": "^4.7.1",
|
||||
"qrcode.vue": "^3.9.0",
|
||||
"qs": "^6.15.0",
|
||||
"tailwindcss": "^4.3.0",
|
||||
"vue": "^3.5.34",
|
||||
"vue-draggable-plus": "^0.6.0",
|
||||
"vue-i18n": "^11.1.10",
|
||||
"vue-json-pretty": "^2.5.0",
|
||||
"vue-router": "^5.0.7",
|
||||
"vue-web-terminal": "^3.4.1",
|
||||
"vue3-cron-plus": "^0.1.9",
|
||||
"vuedraggable": "^2.24.3",
|
||||
"xgplayer": "^3.0.20",
|
||||
"xlsx": "^0.18.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^21.0.1",
|
||||
"@commitlint/config-conventional": "^21.0.1",
|
||||
"@eslint/js": "^10.0.0",
|
||||
"@iconify/utils": "^2.3.0",
|
||||
"@types/codemirror": "^5.60.17",
|
||||
"@types/dagre": "^0.7.54",
|
||||
"@types/file-saver": "^2.0.7",
|
||||
"@types/markdown-it": "^14.1.2",
|
||||
"@types/node": "^24.0.5",
|
||||
"@types/nprogress": "^0.2.3",
|
||||
"@types/path-browserify": "^1.0.3",
|
||||
"@types/qs": "^6.14.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.59.3",
|
||||
"@typescript-eslint/parser": "^8.59.3",
|
||||
"@vitejs/plugin-vue": "^6.0.6",
|
||||
"@vue/compiler-sfc": "^3.5.22",
|
||||
"@vue/test-utils": "^2.4.10",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"commitizen": "^4.3.1",
|
||||
"cz-git": "^1.13.1",
|
||||
"eslint": "^10.3.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-prettier": "^5.5.3",
|
||||
"eslint-plugin-vue": "^10.4.0",
|
||||
"fs-extra": "^11.2.0",
|
||||
"globals": "^15.15.0",
|
||||
"husky": "^9.1.7",
|
||||
"jsdom": "^29.1.1",
|
||||
"lint-staged": "^15.5.2",
|
||||
"postcss": "^8.5.6",
|
||||
"postcss-html": "^1.8.0",
|
||||
"postcss-scss": "^4.0.9",
|
||||
"prettier": "^3.6.2",
|
||||
"rollup-plugin-visualizer": "^5.12.0",
|
||||
"sass": "^1.89.2",
|
||||
"stylelint": "^17.0.0",
|
||||
"stylelint-config-html": "^1.1.0",
|
||||
"stylelint-config-recess-order": "^7.7.0",
|
||||
"stylelint-config-recommended": "^18.0.0",
|
||||
"stylelint-config-recommended-scss": "^17.0.1",
|
||||
"stylelint-config-recommended-vue": "^1.6.1",
|
||||
"stylelint-config-standard": "^40.0.0",
|
||||
"stylelint-order": "^8.0.0",
|
||||
"stylelint-prettier": "^5.0.3",
|
||||
"terser": "^5.43.1",
|
||||
"tsx": "^4.20.3",
|
||||
"typescript": "^6.0.3",
|
||||
"typescript-eslint": "^8.59.3",
|
||||
"unplugin-auto-import": "^20.2.0",
|
||||
"unplugin-element-plus": "^0.10.0",
|
||||
"unplugin-vue-components": "^29.1.0",
|
||||
"vite": "^7.1.5",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-vue-devtools": "^8.1.2",
|
||||
"vitest": "^4.1.7",
|
||||
"vue-demi": "^0.14.9",
|
||||
"vue-eslint-parser": "^10.4.0",
|
||||
"vue-img-cutter": "^3.1.1",
|
||||
"vue-tsc": "^3.2.9"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"glob": "13.0.6",
|
||||
"rimraf": "6.1.3",
|
||||
"uuid": "14.0.0",
|
||||
"fstream": "1.0.12",
|
||||
"lodash.isequal": "4.5.0"
|
||||
}
|
||||
},
|
||||
"packageManager": "pnpm@9.15.3",
|
||||
"engines": {
|
||||
"node": ">=20.19.0",
|
||||
"npm": ">=10.0.0",
|
||||
"pnpm": ">=8.8.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://gitee.com/fastapiadmin/FastapiAdmin.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://gitee.com/fastapiadmin/FastapiAdmin/issues"
|
||||
},
|
||||
"author": "fastapiadmin <948080782@qq.com>",
|
||||
"license": "MIT",
|
||||
"homepage": "https://gitee.com/fastapiadmin/FastapiAdmin",
|
||||
"browserslist": [
|
||||
"Chrome >= 84",
|
||||
"Firefox >= 83",
|
||||
"Safari >= 14.1",
|
||||
"Edge >= 84",
|
||||
"not dead"
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 721 KiB |
|
After Width: | Height: | Size: 604 KiB |
|
After Width: | Height: | Size: 563 KiB |
|
After Width: | Height: | Size: 232 KiB |
@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 400 300" fill="none" xmlns="http://www.w3.org/2000/svg"><mask id="a" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="44" y="42" width="312" height="217"><path d="M355.3 42H44v216.9h311.3V42Z" fill="#fff"/></mask><g mask="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M288.2 248.4h25.1v-30h-25.1v30Z" fill="#C7DEFF"/><path fill-rule="evenodd" clip-rule="evenodd" d="M304.498 238.199c-1.5-3.9-5.9-15.4-4-21.6-2.9.8-3.3.1-5-.1-1.7-.1 0 10.7 2.2 16.4 1.7 4.5 2.1 11.1 2.1 13.6h5.4c.2-1.9.3-5.5-.7-8.3Z" fill="#fff"/><path d="M311.5 214.7v-1.6c0-.7-.6-1.3-1.3-1.3h-22.8c-.7 0-1.3.6-1.3 1.3v1.6" fill="#fff"/><path d="M311.5 214.7v-1.6c0-.7-.6-1.3-1.3-1.3h-22.8c-.7 0-1.3.6-1.3 1.3v1.6M290.2 214.7h21.4c1 0 1.8.8 1.8 1.8v29" stroke="#071F4D" stroke-width="1.096"/><path d="M284.3 245.6v-29c0-1 .8-1.8 1.8-1.8h1.6" fill="#fff"/><path d="M284.3 245.6v-29c0-1 .8-1.8 1.8-1.8h1.6" stroke="#071F4D" stroke-width="1.096"/><path d="M295.402 216.5c-.9 4.2-.4 9.7 2.8 17.5 2.4 5.9 1.9 10.2 1.8 12.3M300.502 216.5c-.9 4.2-.4 9.7 2.8 17.5 2.4 5.9 1.9 10.2 1.8 12.3" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="m331 258.4-.3-5.2H88.5l-1.2 5.2H331Z" fill="#C7DEFF"/><path d="M252.9 248.7H331M216.6 258.4H331M47.1 139.3l-2.6 1.5 42.7 117.6h129.2v-6.6" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="m247.2 248.6-40.4-111.3H50.5l40.3 111.3h156.4Z" fill="#fff"/><path d="m247.2 248.6-40.4-111.3H50.5l40.3 111.3h156.4Z" stroke="#071F4D"/><path d="m203.2 153.2 32.2 88.7H97.8l-32.3-88.7" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M72.2 146.9c-.77 0-1.4.63-1.4 1.4 0 .77.63 1.4 1.4 1.4.77 0 1.4-.63 1.4-1.4 0-.77-.63-1.4-1.4-1.4ZM79.3 146.9c-.77 0-1.4.63-1.4 1.4 0 .77.63 1.4 1.4 1.4.77 0 1.4-.63 1.4-1.4 0-.77-.63-1.4-1.4-1.4Z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M263.5 171.2h80.3v-63.7h-80.3v63.7Z" fill="#C7DEFF"/><path fill-rule="evenodd" clip-rule="evenodd" d="M290 143.9h-45.6l12.5 51.3H290v-51.3Z" fill="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M286 117.4h-29.3v77.8h92.9v-67.6l-55.9.6-7.7-10.8Z" fill="#00E4E5"/><path d="m332.6 127.6-38.9.6-7.7-10.8h-11.7M308.9 195.2h45.9M250.3 195.2h28.5M287.3 195.2h12.3" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M130.5 211.4H186v-44h-55.5v44Z" fill="#C7DEFF"/><path fill-rule="evenodd" clip-rule="evenodd" d="M148.7 192.5h-31.6l8.7 35.5h22.9v-35.5Z" fill="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M145.9 174.2h-20.2V228h64.1v-46.7l-38.6.4-5.3-7.5Z" fill="#006EFF"/><path d="m179 181.3-27.8.4-5.3-7.5h-7.7M176.2 201.7h19.2M163.2 210.7H195M172.1 228h-54.2M184.8 228h8.1M174.9 228h5.4" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="m293.2 155.7-6.4 6.3 15.3 15.3 22.7-22.6-6.4-6.4-16.3 16.3-8.9-8.9Z" fill="#fff"/><path d="M57.2 258.4h283.6M345.9 258.4h8.1M55.4 258.4h220.5M160.1 118.8l-1.2 2.7M156.7 127c-.3.8-.7 1.8-1.1 2.8M222 68.5c-1 .2-1.9.5-2.9.8M214.1 70.7c-5.8 1.9-11.3 4.4-16.5 7.4M195.4 79.5c-.9.5-1.7 1.1-2.5 1.6M314.2 98.5c-.6-.8-1.3-1.5-2-2.3M308.9 92.8c-4-4-8.3-7.6-13-10.8M293.9 80.7c-.8-.5-1.7-1.1-2.5-1.6" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M251.296 71.203c-3.6-1.5-18.5-2.9-21.8-1.9-1 5.8 4.9 13.5 4.9 13.5s6-9.9 16.9-11.6Z" fill="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M251.3 42.704c-6.5 6.7-7.8 13-8.8 19.3 24.4-1.1 36.3 13 42.8 20 3.2-9.1 7.8-23 7.2-29-7.1-6.4-20-11.7-41.2-10.3Z" fill="#C7DEFF"/><path d="M230 69.3c36.2-3.8 52 21.1 52 21.1s11.4-28.2 10.5-37.4c-7.3-6.5-23.3-12-45.6-10.1-9 6.3-15.6 18.7-16.9 26.4Z" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M161.604 70.7c-6 8.4-9.9 21.9-8.8 33.8 8.4 5.3 32.3 10.5 43.6 11.5 6.1-7.9 15.9-26 15.9-26s-32-4.8-50.7-19.3Z" fill="#C7DEFF"/><path d="M193.103 119.5c4.8-2.7 19.2-29.5 19.2-29.5s-35.8-5.4-53.7-21.8c-9.3 6.1-16.4 24.3-15 40.1 10.6 6.7 45.8 13.3 49.5 11.2Z" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M189.5 111.6c-3 5.2-5.7 7.2-9.8 6.6 12.2 2.6 13.5 1.2 15.6-1.1 2.2-2.4 4.2-6.6 4.2-6.6s-3.1 2.5-10 1.1Z" fill="#071F4D"/><path d="M331 251.8v6.6M77 165.4l-2.7-6.7h7.8M222.8 228.9l2.8 6.6h-7.9" stroke="#071F4D"/></g></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 1013 KiB |
|
After Width: | Height: | Size: 242 KiB |
|
After Width: | Height: | Size: 948 KiB |
|
After Width: | Height: | Size: 752 KiB |
@ -0,0 +1,70 @@
|
||||
<svg width="695" height="695" viewBox="195 164.5 695 695" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="white"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="#ECEFFF"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint0_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint1_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint2_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint3_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="white"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="#ECEFFF"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint4_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint5_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint6_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint7_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="white"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="#ECEFFF"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint8_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint9_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint10_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint11_radial_402_5926)"/>
|
||||
<defs>
|
||||
<radialGradient id="paint0_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-137.956 -387.324 387.315 -228.814 483.689 731.186)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint1_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-140.464 -366.075 365.281 -152.396 447.03 691.661)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint2_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-111.514 -277.545 374.955 -279.04 405.025 738.373)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint3_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-190.674 -263.482 350.863 -361.721 469.942 706.034)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint4_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-186.573 -387.324 523.807 -228.814 804.163 731.186)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint5_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-189.964 -366.075 494.008 -152.396 754.585 691.661)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint6_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-150.813 -277.545 507.091 -279.04 697.777 738.373)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint7_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-257.868 -263.482 474.509 -361.721 785.571 706.034)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint8_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-143.901 -163.816 404.006 -96.7753 707.774 729.368)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint9_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-146.517 -154.829 381.023 -64.455 669.536 712.651)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint10_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-116.32 -117.386 391.113 -118.018 625.721 732.407)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint11_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-198.891 -111.438 365.983 -152.988 693.435 718.729)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 131 KiB |
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
JOB_NAME=${JOB_NAME:-csg-web}
|
||||
SERVICE_NAME=${SERVICE_NAME:-csg_web}
|
||||
COMPOSE_FILE=${COMPOSE_FILE:-../docker-compose.yml}
|
||||
|
||||
echo "[deploy] image: ${JOB_NAME}"
|
||||
echo "[deploy] service: ${SERVICE_NAME}"
|
||||
echo "[deploy] compose: ${COMPOSE_FILE}"
|
||||
|
||||
docker stop "${SERVICE_NAME}" || true
|
||||
docker rm "${SERVICE_NAME}" || true
|
||||
docker rmi "${JOB_NAME}" || true
|
||||
|
||||
docker build -t "${JOB_NAME}" .
|
||||
|
||||
if docker compose version >/dev/null 2>&1; then
|
||||
IMAGE_NAME="${JOB_NAME}" docker compose -f "${COMPOSE_FILE}" up -d "${SERVICE_NAME}"
|
||||
else
|
||||
IMAGE_NAME="${JOB_NAME}" docker-compose -f "${COMPOSE_FILE}" up -d "${SERVICE_NAME}"
|
||||
fi
|
||||
|
||||
echo "[deploy] ${SERVICE_NAME} deploy done"
|
||||
@ -0,0 +1,198 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/ai/chat";
|
||||
|
||||
/** 会话分页列表查询(列表接口) */
|
||||
export interface ChatSessionListQuery extends PageQuery {
|
||||
title?: string;
|
||||
created_at?: string[];
|
||||
updated_at?: string[];
|
||||
}
|
||||
|
||||
export const AiChatAPI = {
|
||||
getSessionList(query: ChatSessionListQuery) {
|
||||
return request<ApiResponse<PageResult<ChatSession>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
createSession(body: { title: string }) {
|
||||
return request<ApiResponse<ChatSession>>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateSession(id: string, body: { title: string }) {
|
||||
return request<ApiResponse<ChatSession>>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteSession(body: string[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
chat(body: { message: string; session_id?: string | null }) {
|
||||
return request<ApiResponse<AiChatResponse>>({
|
||||
url: `${API_PATH}/ai-chat`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
getSessionDetail(sessionId: string) {
|
||||
return request<ApiResponse<ChatSessionDetail>>({
|
||||
url: `${API_PATH}/detail/${sessionId}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
// ============ AI 模型配置 ============ //
|
||||
getModelConfig() {
|
||||
return request<ApiResponse<AiModelConfigList>>({
|
||||
url: `${API_PATH}/model`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createModelConfig(body: AiModelConfigInput) {
|
||||
return request<ApiResponse<AiModelConfigItem>>({
|
||||
url: `${API_PATH}/model`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateModelConfig(id: string, body: AiModelConfigInput) {
|
||||
return request<ApiResponse<AiModelConfigItem>>({
|
||||
url: `${API_PATH}/model/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteModelConfig(id: string) {
|
||||
return request<ApiResponse<null>>({
|
||||
url: `${API_PATH}/model/${id}`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
activateModelConfig(id: string) {
|
||||
return request<ApiResponse<null>>({
|
||||
url: `${API_PATH}/model/${id || "__default__"}/activate`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export interface AiModelConfigInput {
|
||||
name: string;
|
||||
base_url: string;
|
||||
api_key: string;
|
||||
model_id: string;
|
||||
temperature: number;
|
||||
}
|
||||
|
||||
export interface AiModelConfigItem extends AiModelConfigInput {
|
||||
id: string;
|
||||
created_time: string | null;
|
||||
}
|
||||
|
||||
export interface AiModelConfigList {
|
||||
items: AiModelConfigItem[];
|
||||
active_id: string | null;
|
||||
}
|
||||
|
||||
export default AiChatAPI;
|
||||
|
||||
export interface ChatSessionMessage {
|
||||
id: string;
|
||||
role: string;
|
||||
content: string;
|
||||
created_at: number | null;
|
||||
}
|
||||
|
||||
export interface ChatSession {
|
||||
session_id: string;
|
||||
agent_id: string | null;
|
||||
team_id: string | null;
|
||||
team_name: string | null;
|
||||
workflow_id: string | null;
|
||||
user_id: string | null;
|
||||
session_data: Record<string, any> | null;
|
||||
agent_data: Record<string, any> | null;
|
||||
team_data: Record<string, any> | null;
|
||||
workflow_data: Record<string, any> | null;
|
||||
metadata: Record<string, any> | null;
|
||||
runs: Array<Record<string, any>> | null;
|
||||
summary: Record<string, any> | null;
|
||||
created_at: number | null;
|
||||
updated_at: number | null;
|
||||
|
||||
id: string;
|
||||
title: string | null;
|
||||
created_time: string | null;
|
||||
updated_time: string | null;
|
||||
message_count: number;
|
||||
messages: ChatSessionMessage[];
|
||||
}
|
||||
|
||||
export interface SessionGroup {
|
||||
id: string;
|
||||
title: string;
|
||||
sessions: ChatSession[];
|
||||
}
|
||||
|
||||
export interface UserInfo {
|
||||
id: number;
|
||||
name: string;
|
||||
username: string;
|
||||
avatar: string;
|
||||
email: string;
|
||||
}
|
||||
|
||||
export interface AiChatResponse {
|
||||
response: string;
|
||||
session_id: string;
|
||||
function_calls: Array<{
|
||||
name: string;
|
||||
arguments: Record<string, any>;
|
||||
}> | null;
|
||||
action: Record<string, any> | null;
|
||||
}
|
||||
|
||||
export interface ChatSessionDetail {
|
||||
session_id: string;
|
||||
agent_id: string | null;
|
||||
team_id: string | null;
|
||||
team_name: string | null;
|
||||
workflow_id: string | null;
|
||||
user_id: string | null;
|
||||
session_data: Record<string, any> | null;
|
||||
agent_data: Record<string, any> | null;
|
||||
team_data: Record<string, any> | null;
|
||||
workflow_data: Record<string, any> | null;
|
||||
metadata: Record<string, any> | null;
|
||||
runs: Array<Record<string, any>> | null;
|
||||
summary: Record<string, any> | null;
|
||||
created_at: number | null;
|
||||
updated_at: number | null;
|
||||
|
||||
id: string;
|
||||
title: string | null;
|
||||
created_time: string | null;
|
||||
updated_time: string | null;
|
||||
message_count: number;
|
||||
messages: ChatSessionMessage[];
|
||||
}
|
||||
@ -0,0 +1,117 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/example/demo";
|
||||
|
||||
const DemoAPI = {
|
||||
getDemoList(query: DemoPageQuery) {
|
||||
return request<ApiResponse<PageResult<DemoTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
getDemoDetail(query: number) {
|
||||
return request<ApiResponse<DemoTable>>({
|
||||
url: `${API_PATH}/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createDemo(body: DemoForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateDemo(id: number, body: DemoForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteDemo(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchDemo(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/available/setting`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
exportDemo(body: DemoPageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/export`,
|
||||
method: "post",
|
||||
data: body,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
|
||||
downloadTemplateDemo() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/download/template`,
|
||||
method: "post",
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
|
||||
importDemo(body: FormData) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/import`,
|
||||
method: "post",
|
||||
data: body,
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default DemoAPI;
|
||||
|
||||
export interface DemoPageQuery extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
name?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface DemoTable extends BaseType {
|
||||
name?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
int_val?: number;
|
||||
bigint_val?: number;
|
||||
float_val?: number;
|
||||
bool_val?: boolean;
|
||||
date_val?: string;
|
||||
time_val?: string;
|
||||
datetime_val?: string;
|
||||
text_val?: string;
|
||||
json_val?: Record<string, any>;
|
||||
}
|
||||
|
||||
export interface DemoForm extends BaseFormType {
|
||||
name?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
int_val?: number;
|
||||
bigint_val?: number;
|
||||
float_val?: number;
|
||||
bool_val?: boolean;
|
||||
date_val?: string;
|
||||
time_val?: Date | string;
|
||||
datetime_val?: Date | string;
|
||||
text_val?: string;
|
||||
json_val?: Record<string, any>;
|
||||
}
|
||||
@ -0,0 +1,95 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/monitor/cache";
|
||||
|
||||
const CacheAPI = {
|
||||
getCacheInfo() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/info`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
getCacheNames() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/get/names`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
getCacheKeys(cacheName: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/get/keys/${cacheName}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
getCacheValue(cacheName: string, cacheKey: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/get/value/${cacheName}/${cacheKey}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
deleteCacheName(cacheName: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete/name/${cacheName}`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
deleteCacheKey(cacheKey: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete/key/${cacheKey}`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
deleteCacheAll() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete/all`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default CacheAPI;
|
||||
|
||||
export interface CacheForm {
|
||||
cache_name: string;
|
||||
cache_key: string;
|
||||
cache_value: string;
|
||||
}
|
||||
|
||||
export interface CacheInfo {
|
||||
cache_key: string;
|
||||
cache_name: string;
|
||||
cache_value: string;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface CommandStats {
|
||||
name: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface RedisInfo {
|
||||
redis_version: string;
|
||||
redis_mode: string;
|
||||
tcp_port: number;
|
||||
connected_clients: number;
|
||||
uptime_in_days: number;
|
||||
used_memory_human: string;
|
||||
used_cpu_user_children: string;
|
||||
maxmemory_human: string;
|
||||
aof_enabled: string;
|
||||
rdb_last_bgsave_status: string;
|
||||
instantaneous_input_kbps: number;
|
||||
instantaneous_output_kbps: number;
|
||||
}
|
||||
|
||||
export interface CacheMonitor {
|
||||
command_stats: CommandStats[];
|
||||
db_size: number;
|
||||
info: RedisInfo;
|
||||
}
|
||||
@ -0,0 +1,54 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/monitor/online";
|
||||
|
||||
const OnlineAPI = {
|
||||
// 查询在线用户列表
|
||||
listOnline(query: OnlineUserPageQuery) {
|
||||
return request<ApiResponse<PageResult<OnlineUserTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
// 强退用户
|
||||
deleteOnline(body: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
// 强退用户
|
||||
clearOnline() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/clear`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default OnlineAPI;
|
||||
|
||||
export interface OnlineUserPageQuery extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
ipaddr?: string;
|
||||
name?: string;
|
||||
login_location?: string;
|
||||
}
|
||||
|
||||
export interface OnlineUserTable {
|
||||
session_id: string;
|
||||
user_id: number;
|
||||
tenant_id?: number;
|
||||
is_superuser?: boolean;
|
||||
name: string;
|
||||
user_name: string;
|
||||
ipaddr?: string;
|
||||
login_location?: string;
|
||||
os?: string;
|
||||
browser?: string;
|
||||
login_time?: string;
|
||||
login_type?: string;
|
||||
}
|
||||
@ -0,0 +1,248 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/monitor/resource";
|
||||
|
||||
export const ResourceAPI = {
|
||||
/**
|
||||
* 获取目录列表
|
||||
* @param query 查询参数
|
||||
*/
|
||||
listResource(query: ResourcePageQuery) {
|
||||
return request<ApiResponse<PageResult<ResourceItem>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 上传文件
|
||||
* @param formData 文件数据
|
||||
*/
|
||||
uploadFile(formData: FormData) {
|
||||
return request<ApiResponse<ResourceUploadSchema>>({
|
||||
url: `${API_PATH}/upload`,
|
||||
method: "post",
|
||||
data: formData,
|
||||
headers: { "Content-Type": "multipart/form-data" },
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 下载文件
|
||||
* @param path 文件路径
|
||||
*/
|
||||
downloadFile(path: string) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/download`,
|
||||
method: "get",
|
||||
params: { path },
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 删除文件或目录
|
||||
* @param body 文件路径数组
|
||||
*/
|
||||
deleteResource(body: string[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 移动文件或目录
|
||||
* @param body 移动参数
|
||||
*/
|
||||
moveResource(body: ResourceMoveQuery) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/move`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 复制文件或目录
|
||||
* @param body 复制参数
|
||||
*/
|
||||
copyResource(body: ResourceCopyQuery) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/copy`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 重命名文件或目录
|
||||
* @param body 重命名参数
|
||||
*/
|
||||
renameResource(body: ResourceRenameQuery) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/rename`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 创建目录
|
||||
* @param body 创建目录参数
|
||||
*/
|
||||
createDirectory(body: ResourceCreateDirQuery) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create-dir`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 导出资源列表
|
||||
* @param body 导出条件
|
||||
*/
|
||||
exportResource(body: ResourcePageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/export`,
|
||||
method: "post",
|
||||
data: body,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default ResourceAPI;
|
||||
|
||||
/**
|
||||
* 资源列表查询参数
|
||||
*/
|
||||
export interface ResourceListQuery {
|
||||
/** 目录路径 */
|
||||
path?: string;
|
||||
/** 包含隐藏文件 */
|
||||
include_hidden?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源目录模型
|
||||
*/
|
||||
export interface ResourceDirectorySchema {
|
||||
/** 目录路径 */
|
||||
path: string;
|
||||
/** 目录名称 */
|
||||
name: string;
|
||||
/** 目录项 */
|
||||
items: ResourceItem[];
|
||||
/** 文件总数 */
|
||||
total_files: number;
|
||||
/** 目录总数 */
|
||||
total_dirs: number;
|
||||
/** 总大小 */
|
||||
total_size: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源搜索查询参数
|
||||
*/
|
||||
export interface ResourceSearchQuery {
|
||||
/** 关键词 */
|
||||
name?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源分页查询参数
|
||||
*/
|
||||
export interface ResourcePageQuery extends PageQuery {
|
||||
/** 关键词 */
|
||||
name?: string;
|
||||
/** 目录路径 */
|
||||
path?: string;
|
||||
/** 包含隐藏文件 */
|
||||
include_hidden?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源上传响应模型
|
||||
*/
|
||||
export interface ResourceUploadSchema {
|
||||
/** 文件名 */
|
||||
filename: string;
|
||||
/** 访问URL */
|
||||
file_url: string;
|
||||
/** 文件大小 */
|
||||
file_size: number;
|
||||
/** 上传时间 */
|
||||
upload_time: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源项信息
|
||||
*/
|
||||
export interface ResourceItem {
|
||||
/** 文件/目录名称 */
|
||||
name: string;
|
||||
/** 文件URL路径 */
|
||||
file_url: string;
|
||||
/** 相对路径 */
|
||||
relative_path?: string;
|
||||
/** 是否为文件 */
|
||||
is_file?: boolean;
|
||||
/** 是否为目录 */
|
||||
is_dir?: boolean;
|
||||
/** 文件大小(字节) */
|
||||
size?: number | null;
|
||||
/** 创建时间 */
|
||||
created_time?: string;
|
||||
/** 修改时间 */
|
||||
modified_time?: string;
|
||||
/** 是否为隐藏文件 */
|
||||
is_hidden?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源移动参数
|
||||
*/
|
||||
export interface ResourceMoveQuery {
|
||||
/** 源路径 */
|
||||
source_path: string;
|
||||
/** 目标路径 */
|
||||
target_path: string;
|
||||
/** 是否覆盖 */
|
||||
overwrite?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源复制参数
|
||||
*/
|
||||
export interface ResourceCopyQuery {
|
||||
/** 源路径 */
|
||||
source_path: string;
|
||||
/** 目标路径 */
|
||||
target_path: string;
|
||||
/** 是否覆盖 */
|
||||
overwrite?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 资源重命名参数
|
||||
*/
|
||||
export interface ResourceRenameQuery {
|
||||
/** 原路径 */
|
||||
old_path: string;
|
||||
/** 新名称 */
|
||||
new_name: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建目录参数
|
||||
*/
|
||||
export interface ResourceCreateDirQuery {
|
||||
/** 父目录路径 */
|
||||
parent_path: string;
|
||||
/** 目录名称 */
|
||||
dir_name: string;
|
||||
}
|
||||
@ -0,0 +1,67 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/monitor/server";
|
||||
|
||||
const ServerAPI = {
|
||||
// 获取服务信息
|
||||
getServer() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/info`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default ServerAPI;
|
||||
|
||||
export interface Cpu {
|
||||
cpu_num: number;
|
||||
used: number;
|
||||
sys: number;
|
||||
free: number;
|
||||
}
|
||||
|
||||
export interface Memory {
|
||||
total: string;
|
||||
used: string;
|
||||
free: string;
|
||||
usage: number;
|
||||
}
|
||||
|
||||
export interface System {
|
||||
computer_ip: string;
|
||||
computer_name: string;
|
||||
os_arch: string;
|
||||
os_name: string;
|
||||
user_dir: string;
|
||||
}
|
||||
|
||||
export interface Python {
|
||||
name: string;
|
||||
version: string;
|
||||
start_time: string;
|
||||
run_time: string;
|
||||
home: string;
|
||||
memory_total: string;
|
||||
memory_used: string;
|
||||
memory_free: string;
|
||||
memory_usage: number;
|
||||
}
|
||||
|
||||
export interface SysFile {
|
||||
dir_name: string;
|
||||
sys_type_name: string;
|
||||
type_name: string;
|
||||
total: string;
|
||||
free: string;
|
||||
used: string;
|
||||
usage: number;
|
||||
}
|
||||
|
||||
export interface ServerInfo {
|
||||
cpu: Cpu;
|
||||
mem: Memory;
|
||||
sys: System;
|
||||
py: Python;
|
||||
disks: SysFile[];
|
||||
}
|
||||
@ -0,0 +1,238 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/platform/email";
|
||||
|
||||
const EmailAPI = {
|
||||
// ─── SMTP 配置 ────────────────────────────────────────────
|
||||
listConfig(query?: EmailConfigPageQuery) {
|
||||
return request<ApiResponse<PageResult<EmailConfigTable>>>({
|
||||
url: `${API_PATH}/config/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailConfig(id: number) {
|
||||
return request<ApiResponse<EmailConfigTable>>({
|
||||
url: `${API_PATH}/config/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createConfig(body: EmailConfigCreateForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/config/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateConfig(id: number, body: EmailConfigUpdateForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/config/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteConfig(ids: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/config/delete`,
|
||||
method: "delete",
|
||||
data: ids,
|
||||
});
|
||||
},
|
||||
|
||||
testConfig(body: EmailTestForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/config/test`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
// ─── 邮件模板 ────────────────────────────────────────────
|
||||
listTemplate(query?: EmailTemplatePageQuery) {
|
||||
return request<ApiResponse<PageResult<EmailTemplateTable>>>({
|
||||
url: `${API_PATH}/template/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailTemplate(id: number) {
|
||||
return request<ApiResponse<EmailTemplateTable>>({
|
||||
url: `${API_PATH}/template/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createTemplate(body: EmailTemplateCreateForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/template/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateTemplate(id: number, body: EmailTemplateUpdateForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/template/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteTemplate(ids: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/template/delete`,
|
||||
method: "delete",
|
||||
data: ids,
|
||||
});
|
||||
},
|
||||
|
||||
// ─── 手动发送 ────────────────────────────────────────────
|
||||
sendEmail(body: EmailSendForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/send`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
// ─── 发送日志 ────────────────────────────────────────────
|
||||
listLog(query?: EmailLogPageQuery) {
|
||||
return request<ApiResponse<PageResult<EmailLogTable>>>({
|
||||
url: `${API_PATH}/log/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default EmailAPI;
|
||||
|
||||
// ─── EmailConfig 类型 ──────────────────────────────────────
|
||||
|
||||
export interface EmailConfigPageQuery extends PageQuery, UserByQueryParams {
|
||||
name?: string;
|
||||
is_default?: boolean;
|
||||
}
|
||||
|
||||
export interface EmailConfigTable extends BaseType {
|
||||
name: string;
|
||||
smtp_host: string;
|
||||
smtp_port: number;
|
||||
smtp_user: string;
|
||||
from_name: string;
|
||||
use_tls: boolean;
|
||||
is_default: boolean;
|
||||
timeout: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface EmailConfigCreateForm {
|
||||
name: string;
|
||||
smtp_host: string;
|
||||
smtp_port: number;
|
||||
smtp_user: string;
|
||||
smtp_password: string;
|
||||
from_name?: string;
|
||||
use_tls?: boolean;
|
||||
is_default?: boolean;
|
||||
timeout?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface EmailConfigUpdateForm {
|
||||
name?: string;
|
||||
smtp_host?: string;
|
||||
smtp_port?: number;
|
||||
smtp_user?: string;
|
||||
smtp_password?: string;
|
||||
from_name?: string;
|
||||
use_tls?: boolean;
|
||||
is_default?: boolean;
|
||||
timeout?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface EmailTestForm {
|
||||
config_id: number;
|
||||
to_email: string;
|
||||
}
|
||||
|
||||
// ─── EmailTemplate 类型 ──────────────────────────────────────
|
||||
|
||||
export interface EmailTemplatePageQuery extends PageQuery, UserByQueryParams {
|
||||
name?: string;
|
||||
template_code?: string;
|
||||
}
|
||||
|
||||
export interface EmailTemplateTable extends BaseType {
|
||||
name: string;
|
||||
template_code: string;
|
||||
subject: string;
|
||||
body_html: string;
|
||||
body_text?: string;
|
||||
variables?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface EmailTemplateCreateForm {
|
||||
name: string;
|
||||
template_code: string;
|
||||
subject: string;
|
||||
body_html: string;
|
||||
body_text?: string;
|
||||
variables?: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface EmailTemplateUpdateForm {
|
||||
name?: string;
|
||||
template_code?: string;
|
||||
subject?: string;
|
||||
body_html?: string;
|
||||
body_text?: string;
|
||||
variables?: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
// ─── EmailLog 类型 ──────────────────────────────────────────
|
||||
|
||||
export interface EmailLogPageQuery extends PageQuery, UserByQueryParams {
|
||||
to_email?: string;
|
||||
biz_type?: string;
|
||||
template_code?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface EmailLogTable {
|
||||
id: number;
|
||||
config_id?: number;
|
||||
template_code?: string;
|
||||
to_email: string;
|
||||
to_name?: string;
|
||||
subject: string;
|
||||
biz_type: string;
|
||||
status: number;
|
||||
error_msg?: string;
|
||||
retry_count: number;
|
||||
tenant_id?: number;
|
||||
created_time?: string;
|
||||
sent_time?: string;
|
||||
}
|
||||
|
||||
export interface EmailSendForm {
|
||||
to_email: string;
|
||||
to_name?: string;
|
||||
template_code: string;
|
||||
variables?: Record<string, unknown>;
|
||||
config_id?: number;
|
||||
biz_type?: string;
|
||||
}
|
||||
@ -0,0 +1,92 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const PLATFORM_API = "/platform/invoice";
|
||||
const TENANT_API = "/platform/tenant/invoice";
|
||||
|
||||
const InvoiceAPI = {
|
||||
// ─── 平台端 ───
|
||||
listInvoices(query?: InvoicePageQuery) {
|
||||
return request<ApiResponse<{ list: InvoiceTable[]; total: number }>>({
|
||||
url: `${PLATFORM_API}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
issueInvoice(invoiceId: number, body: { pdf_url?: string; api_response?: string }) {
|
||||
return request<ApiResponse>({
|
||||
url: `${PLATFORM_API}/issue/${invoiceId}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
voidInvoice(invoiceId: number, reason?: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${PLATFORM_API}/void/${invoiceId}`,
|
||||
method: "put",
|
||||
data: { description: reason },
|
||||
});
|
||||
},
|
||||
|
||||
// ─── 租户端 ───
|
||||
tenantListInvoices(query?: InvoicePageQuery) {
|
||||
return request<ApiResponse<{ list: InvoiceTable[]; total: number }>>({
|
||||
url: `${TENANT_API}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
applyInvoice(body: InvoiceApplyForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${TENANT_API}/apply`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
downloadInvoice(invoiceId: number) {
|
||||
return request<Blob>({
|
||||
url: `${TENANT_API}/${invoiceId}/download`,
|
||||
method: "get",
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default InvoiceAPI;
|
||||
|
||||
export interface InvoicePageQuery extends PageQuery, TenantByQueryParams {
|
||||
invoice_type?: string;
|
||||
}
|
||||
|
||||
export interface InvoiceTable {
|
||||
id: number;
|
||||
tenant_id: number;
|
||||
order_id: number;
|
||||
invoice_no: string;
|
||||
invoice_type: string;
|
||||
title: string;
|
||||
tax_no?: string;
|
||||
amount: number;
|
||||
tax_amount: number;
|
||||
status: number;
|
||||
bank_info?: string;
|
||||
address_info?: string;
|
||||
pdf_url?: string;
|
||||
oss_license_pdf_url?: string;
|
||||
api_response?: string;
|
||||
description?: string;
|
||||
created_time?: string;
|
||||
}
|
||||
|
||||
export interface InvoiceApplyForm {
|
||||
order_id: number;
|
||||
invoice_type: string;
|
||||
title: string;
|
||||
tax_no?: string;
|
||||
address_info?: string;
|
||||
bank_info?: string;
|
||||
description?: string;
|
||||
}
|
||||
@ -0,0 +1,131 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/platform/menu";
|
||||
|
||||
const MenuAPI = {
|
||||
listMenu(query?: MenuPageQuery) {
|
||||
return request<ApiResponse<MenuTable[]>>({
|
||||
url: `${API_PATH}/tree`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailMenu(query: number) {
|
||||
return request<ApiResponse<MenuTable>>({
|
||||
url: `${API_PATH}/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createMenu(body: MenuForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateMenu(id: number, body: MenuForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteMenu(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchMenu(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default MenuAPI;
|
||||
|
||||
export interface MenuPageQuery extends BaseQueryParams {
|
||||
name?: string;
|
||||
menu_client?: "pc" | "app";
|
||||
status?: number;
|
||||
type?: number;
|
||||
permission?: string;
|
||||
route_path?: string;
|
||||
component_path?: string;
|
||||
description?: string;
|
||||
scope?: "platform" | "tenant";
|
||||
}
|
||||
|
||||
export interface MenuTable extends BaseType {
|
||||
name?: string;
|
||||
type?: number;
|
||||
icon?: string;
|
||||
order?: number;
|
||||
permission?: string;
|
||||
route_name?: string;
|
||||
route_path?: string;
|
||||
component_path?: string;
|
||||
redirect?: string;
|
||||
parent_id?: number;
|
||||
parent_name?: string;
|
||||
keep_alive?: boolean;
|
||||
hidden?: boolean;
|
||||
always_show?: boolean;
|
||||
title?: string;
|
||||
params?: { key: string; value: string }[];
|
||||
affix?: boolean;
|
||||
children?: MenuTable[];
|
||||
client?: "pc" | "app";
|
||||
link?: string;
|
||||
is_iframe?: boolean;
|
||||
is_hide_tab?: boolean;
|
||||
active_path?: string;
|
||||
show_badge?: boolean;
|
||||
show_text_badge?: string;
|
||||
scope?: "platform" | "tenant";
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface MenuForm extends BaseFormType {
|
||||
name?: string;
|
||||
type?: number;
|
||||
icon?: string;
|
||||
order?: number;
|
||||
permission?: string;
|
||||
route_name?: string;
|
||||
route_path?: string;
|
||||
component_path?: string;
|
||||
redirect?: string;
|
||||
parent_id?: number;
|
||||
keep_alive?: boolean;
|
||||
hidden?: boolean;
|
||||
always_show?: boolean;
|
||||
title?: string;
|
||||
params?: KeyValue[];
|
||||
affix?: boolean;
|
||||
client?: "pc" | "app";
|
||||
link?: string;
|
||||
is_iframe?: boolean;
|
||||
is_hide_tab?: boolean;
|
||||
active_path?: string;
|
||||
show_badge?: boolean;
|
||||
show_text_badge?: string;
|
||||
scope?: "platform" | "tenant";
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface KeyValue {
|
||||
key: string;
|
||||
value: string;
|
||||
}
|
||||
@ -0,0 +1,188 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
// ─── 平台订单 ──────────────────────────────────────────
|
||||
const ORDER_API = "/platform/order";
|
||||
const PAYMENT_API = "/platform/payment";
|
||||
const REFUND_API = "/platform/refund";
|
||||
const TENANT_ORDER_API = "/tenant/order";
|
||||
|
||||
const OrderAPI = {
|
||||
// ─── 订单管理 ───
|
||||
listOrders(query?: OrderPageQuery) {
|
||||
return request<ApiResponse<{ items: OrderTable[]; total: number }>>({
|
||||
url: `${ORDER_API}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailOrder(orderId: number) {
|
||||
return request<ApiResponse<OrderTable>>({
|
||||
url: `${ORDER_API}/detail/${orderId}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createOrder(body: OrderCreateForm) {
|
||||
return request<ApiResponse<{ id: number; order_no: string }>>({
|
||||
url: `${ORDER_API}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
cancelOrder(orderId: number) {
|
||||
return request<ApiResponse<{ message: string }>>({
|
||||
url: `${ORDER_API}/cancel/${orderId}`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
// ─── 支付操作 ───
|
||||
payOrder(orderId: number, body?: { pay_method?: string }) {
|
||||
return request<
|
||||
ApiResponse<{ order_no: string; amount: number; qr_code_url?: string; pay_url?: string }>
|
||||
>({
|
||||
url: `${PAYMENT_API}/pay/${orderId}`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
queryPaymentStatus(orderId: number) {
|
||||
return request<ApiResponse<{ paid: boolean; order_no?: string; amount?: number }>>({
|
||||
url: `${PAYMENT_API}/status/${orderId}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
mockPaymentCallback(orderId: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${PAYMENT_API}/mock/callback`,
|
||||
method: "post",
|
||||
data: { order_id: orderId },
|
||||
});
|
||||
},
|
||||
|
||||
// ─── 支付记录 ───
|
||||
listPaymentRecords(query?: PageQuery) {
|
||||
return request<ApiResponse<{ items: PaymentRecordTable[]; total: number }>>({
|
||||
url: `${PAYMENT_API}/record/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
// ─── 退款管理 ───
|
||||
listRefunds(query?: RefundPageQuery) {
|
||||
return request<ApiResponse<{ items: RefundTable[]; total: number }>>({
|
||||
url: `${REFUND_API}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
approveRefund(refundId: number) {
|
||||
return request<ApiResponse<{ message: string }>>({
|
||||
url: `${REFUND_API}/approve/${refundId}`,
|
||||
method: "put",
|
||||
});
|
||||
},
|
||||
|
||||
rejectRefund(refundId: number, body: { reject_reason?: string }) {
|
||||
return request<ApiResponse<{ message: string }>>({
|
||||
url: `${REFUND_API}/reject/${refundId}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
// ─── 租户端 ───
|
||||
tenantCreateOrder(body: {
|
||||
tenant_id: number;
|
||||
package_id?: number;
|
||||
plugin_id?: number;
|
||||
order_type: string;
|
||||
pay_method?: string;
|
||||
}) {
|
||||
return request<ApiResponse<{ id: number; order_no: string }>>({
|
||||
url: `${TENANT_ORDER_API}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
tenantApplyRefund(orderId: number, body: { reason: string }) {
|
||||
return request<ApiResponse<{ id: number }>>({
|
||||
url: `${TENANT_ORDER_API}/refund/apply/${orderId}`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default OrderAPI;
|
||||
|
||||
// ─── Order 类型 ──────────────────────────────────────────
|
||||
|
||||
export interface OrderPageQuery extends PageQuery, TenantByQueryParams {
|
||||
order_type?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface OrderTable {
|
||||
id: number;
|
||||
order_no: string;
|
||||
tenant_id: number;
|
||||
package_id?: number;
|
||||
plugin_id?: number;
|
||||
order_type: string;
|
||||
amount: number;
|
||||
period_count: number;
|
||||
status: number;
|
||||
pay_method?: string;
|
||||
pay_time?: string;
|
||||
expire_time: string;
|
||||
created_time?: string;
|
||||
}
|
||||
|
||||
export interface OrderCreateForm {
|
||||
tenant_id: number;
|
||||
package_id?: number;
|
||||
plugin_id?: number;
|
||||
order_type: "new" | "renew" | "upgrade" | "downgrade" | "plugin";
|
||||
pay_method?: string;
|
||||
}
|
||||
|
||||
// ─── Payment 类型 ────────────────────────────────────────
|
||||
|
||||
export interface PaymentRecordTable {
|
||||
id: number;
|
||||
order_id: number;
|
||||
transaction_id?: string;
|
||||
pay_method: string;
|
||||
amount: number;
|
||||
status: number;
|
||||
pay_time?: string;
|
||||
created_time?: string;
|
||||
}
|
||||
|
||||
// ─── Refund 类型 ─────────────────────────────────────────
|
||||
|
||||
export interface RefundPageQuery extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface RefundTable {
|
||||
id: number;
|
||||
order_id: number;
|
||||
refund_no: string;
|
||||
amount: number;
|
||||
reason: string;
|
||||
status: number;
|
||||
refund_transaction_id?: string;
|
||||
reviewer_id?: number;
|
||||
review_time?: string;
|
||||
reject_reason?: string;
|
||||
created_time?: string;
|
||||
}
|
||||
@ -0,0 +1,154 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/platform/package";
|
||||
|
||||
const PackageAPI = {
|
||||
listPackage(query?: PackagePageQuery) {
|
||||
return request<ApiResponse<PageResult<PackageTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailPackage(id: number) {
|
||||
return request<ApiResponse<PackageTable>>({
|
||||
url: `${API_PATH}/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createPackage(body: PackageCreateForm) {
|
||||
return request<ApiResponse<PackageTable>>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updatePackage(id: number, body: PackageUpdateForm) {
|
||||
return request<ApiResponse<PackageTable>>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deletePackage(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchPackageStatus(body: { ids: number[]; status: number }) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
getPackageMenus(packageId: number) {
|
||||
return request<ApiResponse<number[]>>({
|
||||
url: `${API_PATH}/menus/${packageId}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
setPackageMenus(packageId: number, menuIds: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/menus/${packageId}/set`,
|
||||
method: "post",
|
||||
data: { menu_ids: menuIds },
|
||||
});
|
||||
},
|
||||
|
||||
getPackagePlugins(packageId: number) {
|
||||
return request<ApiResponse<number[]>>({
|
||||
url: `${API_PATH}/plugins/${packageId}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
setPackagePlugins(packageId: number, pluginIds: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/plugins/${packageId}/set`,
|
||||
method: "post",
|
||||
data: { plugin_ids: pluginIds },
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default PackageAPI;
|
||||
|
||||
export interface PackagePageQuery extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
name?: string;
|
||||
code?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface PackageTable extends BaseType {
|
||||
name: string;
|
||||
code: string;
|
||||
sort: number;
|
||||
price: number;
|
||||
period: string;
|
||||
trial_days: number;
|
||||
max_users: number;
|
||||
max_roles: number;
|
||||
max_depts: number;
|
||||
max_storage_mb: number;
|
||||
rate_limit: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface PackageForm extends BaseFormType {
|
||||
name?: string;
|
||||
code?: string;
|
||||
sort?: number;
|
||||
price?: number;
|
||||
period?: string;
|
||||
trial_days?: number;
|
||||
max_users?: number;
|
||||
max_roles?: number;
|
||||
max_depts?: number;
|
||||
max_storage_mb?: number;
|
||||
rate_limit?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface PackageCreateForm {
|
||||
name: string;
|
||||
code: string;
|
||||
status?: number;
|
||||
sort?: number;
|
||||
description?: string;
|
||||
price?: number;
|
||||
period?: string;
|
||||
trial_days?: number;
|
||||
max_users?: number;
|
||||
max_roles?: number;
|
||||
max_depts?: number;
|
||||
max_storage_mb?: number;
|
||||
rate_limit?: number;
|
||||
}
|
||||
|
||||
export interface PackageUpdateForm {
|
||||
name?: string;
|
||||
code?: string;
|
||||
status?: number;
|
||||
sort?: number;
|
||||
description?: string;
|
||||
price?: number;
|
||||
period?: string;
|
||||
trial_days?: number;
|
||||
max_users?: number;
|
||||
max_roles?: number;
|
||||
max_depts?: number;
|
||||
max_storage_mb?: number;
|
||||
rate_limit?: number;
|
||||
}
|
||||
@ -0,0 +1,142 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/platform/plugin";
|
||||
|
||||
const PluginAPI = {
|
||||
// 超管:插件列表
|
||||
list(page: PageQuery, search?: PluginQueryParam) {
|
||||
return request<ApiResponse<PageResult<PluginTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: { ...page, ...search },
|
||||
});
|
||||
},
|
||||
|
||||
// 超管:插件详情
|
||||
detail(id: number) {
|
||||
return request<ApiResponse<PluginTable>>({
|
||||
url: `${API_PATH}/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
// 超管:创建插件
|
||||
create(body: PluginForm) {
|
||||
return request<ApiResponse<PluginTable>>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
// 超管:更新插件
|
||||
update(id: number, body: PluginForm) {
|
||||
return request<ApiResponse<PluginTable>>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
// 超管:删除插件
|
||||
delete(ids: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: ids,
|
||||
});
|
||||
},
|
||||
|
||||
// 租户:插件市场
|
||||
marketplace(page: PageQuery, category?: string) {
|
||||
return request<ApiResponse<PageResult<PluginTable>>>({
|
||||
url: `${API_PATH}/marketplace`,
|
||||
method: "get",
|
||||
params: { ...page, category },
|
||||
});
|
||||
},
|
||||
|
||||
// 租户:安装插件
|
||||
install(pluginId: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/install`,
|
||||
method: "post",
|
||||
data: { plugin_id: pluginId },
|
||||
});
|
||||
},
|
||||
|
||||
// 租户:卸载插件
|
||||
uninstall(pluginId: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/uninstall`,
|
||||
method: "post",
|
||||
data: { plugin_id: pluginId },
|
||||
});
|
||||
},
|
||||
|
||||
// 租户:启用/禁用插件
|
||||
toggle(pluginId: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/toggle`,
|
||||
method: "post",
|
||||
data: { plugin_id: pluginId },
|
||||
});
|
||||
},
|
||||
|
||||
// 租户:我的插件
|
||||
myPlugins() {
|
||||
return request<ApiResponse<PluginTable[]>>({
|
||||
url: `${API_PATH}/my`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
// 超管:热重载插件路由
|
||||
reload() {
|
||||
return request<ApiResponse<string>>({
|
||||
url: `${API_PATH}/reload`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default PluginAPI;
|
||||
|
||||
export interface PluginQueryParam extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
name?: string;
|
||||
category?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface PluginTable extends BaseType {
|
||||
name: string;
|
||||
code: string;
|
||||
category?: string;
|
||||
icon?: string;
|
||||
version?: string;
|
||||
price?: number;
|
||||
installed?: boolean;
|
||||
author?: string;
|
||||
menu_path?: string;
|
||||
permission_prefix?: string;
|
||||
dependencies?: string;
|
||||
sort?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface PluginForm extends BaseFormType {
|
||||
name?: string;
|
||||
code?: string;
|
||||
category?: string;
|
||||
icon?: string;
|
||||
version?: string;
|
||||
price?: number;
|
||||
sort?: number;
|
||||
author?: string;
|
||||
menu_path?: string;
|
||||
permission_prefix?: string;
|
||||
dependencies?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
@ -0,0 +1,152 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/platform/tenant";
|
||||
|
||||
const SelfServiceAPI = {
|
||||
/** 可选购的套餐列表 */
|
||||
getAvailablePackages() {
|
||||
return request<ApiResponse<{ packages: AvailablePackage[] }>>({
|
||||
url: `${API_PATH}/package/available`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
/** 套餐变更预览 */
|
||||
previewPackageChange(packageId: number) {
|
||||
return request<ApiResponse<PackageChangePreview>>({
|
||||
url: `${API_PATH}/package/preview`,
|
||||
method: "get",
|
||||
params: { target_package_id: packageId },
|
||||
});
|
||||
},
|
||||
|
||||
/** 创建自助订单 */
|
||||
createOrder(body: SelfServiceOrderForm) {
|
||||
return request<ApiResponse<{ order_id: number; amount: number }>>({
|
||||
url: `${API_PATH}/order/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/** 我的订单列表 */
|
||||
listMyOrders(query?: PageQuery) {
|
||||
return request<ApiResponse<PageResult<SelfServiceOrderItem>>>({
|
||||
url: `${API_PATH}/order/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
/** 订单详情 */
|
||||
detailMyOrder(orderId: number) {
|
||||
return request<ApiResponse<SelfServiceOrderItem>>({
|
||||
url: `${API_PATH}/order/detail/${orderId}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
/** 租户工作台概览 */
|
||||
getWorkspace() {
|
||||
return request<ApiResponse<WorkspaceData>>({
|
||||
url: `${API_PATH}/workspace`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
/** 购买付费插件 */
|
||||
purchasePlugin(body: { plugin_id: number; pay_method?: string }) {
|
||||
return request<ApiResponse<{ id: number; order_no: string }>>({
|
||||
url: `${API_PATH}/plugin/purchase`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default SelfServiceAPI;
|
||||
|
||||
export interface AvailablePackage {
|
||||
id: number;
|
||||
name: string;
|
||||
price: number;
|
||||
period: string;
|
||||
trial_days: number;
|
||||
max_users: number;
|
||||
max_roles: number;
|
||||
max_depts: number;
|
||||
max_storage_mb: number;
|
||||
description: string | null;
|
||||
is_current: boolean;
|
||||
available_actions: string[];
|
||||
}
|
||||
|
||||
export interface PackageChangePreview {
|
||||
current_package: string;
|
||||
target_package: string;
|
||||
action: string;
|
||||
amount: number;
|
||||
period: string;
|
||||
gained_menus: { id: number; name: string; path: string }[];
|
||||
lost_menus: { id: number; name: string; path: string }[];
|
||||
affected_roles: string[];
|
||||
affected_users: number;
|
||||
}
|
||||
|
||||
export interface SelfServiceOrderForm {
|
||||
package_id: number;
|
||||
order_type: "buy" | "renew" | "upgrade" | "downgrade";
|
||||
pay_method?: string;
|
||||
}
|
||||
|
||||
export interface SelfServiceOrderItem {
|
||||
id: number;
|
||||
order_no: string;
|
||||
package_name: string;
|
||||
order_type: string;
|
||||
amount: number;
|
||||
status: number;
|
||||
pay_method?: string;
|
||||
pay_time?: string;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
export interface WorkspaceData {
|
||||
tenant: {
|
||||
id: number;
|
||||
name: string;
|
||||
code: string;
|
||||
status: number;
|
||||
status_label: string;
|
||||
start_time: string | null;
|
||||
end_time: string | null;
|
||||
days_remaining: number;
|
||||
};
|
||||
package: {
|
||||
id: number;
|
||||
name: string;
|
||||
price: number;
|
||||
period: string;
|
||||
} | null;
|
||||
quota: {
|
||||
max_users: number;
|
||||
max_roles: number;
|
||||
max_depts: number;
|
||||
current_users: number;
|
||||
current_roles: number;
|
||||
current_depts: number;
|
||||
usage_percent: {
|
||||
users: number;
|
||||
roles: number;
|
||||
depts: number;
|
||||
};
|
||||
};
|
||||
recent_orders: {
|
||||
id: number;
|
||||
order_no: string;
|
||||
amount: number;
|
||||
order_type: string;
|
||||
status: number;
|
||||
created_at: string | null;
|
||||
}[];
|
||||
}
|
||||
@ -0,0 +1,275 @@
|
||||
import { request, NO_AUTH_FLAG } from "@utils";
|
||||
|
||||
const API_PATH = "/platform/tenant";
|
||||
|
||||
const TenantAPI = {
|
||||
listTenant(query?: TenantPageQuery) {
|
||||
return request<ApiResponse<PageResult<TenantTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailTenant(id: number) {
|
||||
return request<ApiResponse<TenantTable>>({
|
||||
url: `${API_PATH}/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createTenant(body: TenantCreateForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateTenant(id: number, body: TenantUpdateForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteTenant(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/** 批量修改租户状态 */
|
||||
batchTenantStatus(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/** 切换单个租户启用/禁用状态 */
|
||||
toggleTenantStatus(id: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/${id}`,
|
||||
method: "put",
|
||||
});
|
||||
},
|
||||
|
||||
/** 租户续期 */
|
||||
renewTenant(id: number, body: { end_time: string }) {
|
||||
return request<ApiResponse<TenantTable>>({
|
||||
url: `${API_PATH}/renew/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
/** 套餐变更影响预览 */
|
||||
getPackageChangePreview(tenantId: number, newPackageId: number) {
|
||||
return request<ApiResponse<PackageChangePreview>>({
|
||||
url: `${API_PATH}/${tenantId}/package-change-preview`,
|
||||
method: "get",
|
||||
params: { new_package_id: newPackageId },
|
||||
});
|
||||
},
|
||||
|
||||
getTenantUsers(tenantId: number) {
|
||||
return request<ApiResponse<TenantUser[]>>({
|
||||
url: `${API_PATH}/${tenantId}/users`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
addTenantUser(tenantId: number, body: TenantUserAddForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/${tenantId}/users`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
removeTenantUser(tenantId: number, userId: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/${tenantId}/users/${userId}`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
/** 公开接口:无需登录即可获取租户配置(用于登录页等场景) */
|
||||
getTenantConfigInfo(tenantId: number) {
|
||||
return request<ApiResponse<TenantConfigItem[]>>({
|
||||
url: `${API_PATH}/${tenantId}/config/info`,
|
||||
method: "get",
|
||||
headers: {
|
||||
Authorization: NO_AUTH_FLAG,
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
/** 获取租户个性化配置 */
|
||||
getTenantConfig(tenantId: number) {
|
||||
return request<ApiResponse<TenantConfigItem[]>>({
|
||||
url: `${API_PATH}/${tenantId}/config`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
/** 批量更新租户个性化配置 */
|
||||
updateTenantConfig(tenantId: number, body: TenantConfigItem[]) {
|
||||
return request<ApiResponse<TenantConfigItem[]>>({
|
||||
url: `${API_PATH}/${tenantId}/config`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default TenantAPI;
|
||||
|
||||
export interface TenantPageQuery extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
name?: string;
|
||||
code?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface TenantTable extends BaseType {
|
||||
name: string;
|
||||
code: string;
|
||||
package_id?: number;
|
||||
start_time?: string;
|
||||
end_time?: string;
|
||||
contact_name?: string;
|
||||
contact_phone?: string;
|
||||
contact_email?: string;
|
||||
address?: string;
|
||||
domain?: string;
|
||||
logo_url?: string;
|
||||
sort?: number;
|
||||
version?: string;
|
||||
favicon?: string;
|
||||
login_bg?: string;
|
||||
copyright?: string;
|
||||
keep_record?: string;
|
||||
help_doc?: string;
|
||||
privacy?: string;
|
||||
clause?: string;
|
||||
git_code?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface TenantForm extends BaseFormType {
|
||||
name?: string;
|
||||
code?: string;
|
||||
package_id?: number;
|
||||
start_time?: string;
|
||||
end_time?: string;
|
||||
contact_name?: string;
|
||||
contact_phone?: string;
|
||||
contact_email?: string;
|
||||
address?: string;
|
||||
domain?: string;
|
||||
logo_url?: string;
|
||||
sort?: number;
|
||||
version?: string;
|
||||
favicon?: string;
|
||||
login_bg?: string;
|
||||
copyright?: string;
|
||||
keep_record?: string;
|
||||
help_doc?: string;
|
||||
privacy?: string;
|
||||
clause?: string;
|
||||
git_code?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface TenantCreateForm extends BaseFormType {
|
||||
name: string;
|
||||
code: string;
|
||||
package_id?: number;
|
||||
start_time?: string;
|
||||
end_time?: string;
|
||||
contact_name?: string;
|
||||
contact_phone?: string;
|
||||
contact_email?: string;
|
||||
address?: string;
|
||||
domain?: string;
|
||||
logo_url?: string;
|
||||
sort?: number;
|
||||
version?: string;
|
||||
favicon?: string;
|
||||
login_bg?: string;
|
||||
copyright?: string;
|
||||
keep_record?: string;
|
||||
help_doc?: string;
|
||||
privacy?: string;
|
||||
clause?: string;
|
||||
git_code?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface TenantUpdateForm extends BaseFormType {
|
||||
name?: string;
|
||||
code?: string;
|
||||
package_id?: number;
|
||||
start_time?: string;
|
||||
end_time?: string;
|
||||
contact_name?: string;
|
||||
contact_phone?: string;
|
||||
contact_email?: string;
|
||||
address?: string;
|
||||
domain?: string;
|
||||
logo_url?: string;
|
||||
sort?: number;
|
||||
version?: string;
|
||||
favicon?: string;
|
||||
login_bg?: string;
|
||||
copyright?: string;
|
||||
keep_record?: string;
|
||||
help_doc?: string;
|
||||
privacy?: string;
|
||||
clause?: string;
|
||||
git_code?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
/** 套餐变更影响预览 */
|
||||
export interface PackageChangePreview {
|
||||
new_package_id: number;
|
||||
new_package_name: string;
|
||||
affected_roles: Record<string, unknown>[];
|
||||
removed_menus: Record<string, unknown>[];
|
||||
added_menus: Record<string, unknown>[];
|
||||
quota_changes: Record<string, unknown>;
|
||||
total_affected_users: number;
|
||||
}
|
||||
|
||||
export interface TenantUser {
|
||||
id: number;
|
||||
user_id: number;
|
||||
tenant_id: number;
|
||||
role: string;
|
||||
is_default: number;
|
||||
create_time?: string;
|
||||
username: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface TenantUserAddForm {
|
||||
user_id: number;
|
||||
role: string;
|
||||
is_default: number;
|
||||
}
|
||||
|
||||
/** 租户配置项 */
|
||||
export interface TenantConfigItem {
|
||||
config_key: string;
|
||||
config_value: string | null;
|
||||
}
|
||||
@ -0,0 +1,85 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/system/dept";
|
||||
|
||||
const DeptAPI = {
|
||||
listDept(query?: DeptPageQuery) {
|
||||
return request<ApiResponse<DeptTable[]>>({
|
||||
url: `${API_PATH}/tree`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailDept(id: number) {
|
||||
return request<ApiResponse<DeptTable>>({
|
||||
url: `${API_PATH}/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createDept(body: DeptForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateDept(id: number, body: DeptForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteDept(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchDept(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default DeptAPI;
|
||||
|
||||
export interface DeptPageQuery extends UserByQueryParams, TenantByQueryParams {
|
||||
name?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface DeptTable extends BaseType {
|
||||
name?: string;
|
||||
order?: number;
|
||||
code: string;
|
||||
leader?: string;
|
||||
phone?: string;
|
||||
email?: string;
|
||||
parent_id?: number;
|
||||
parent_name?: string;
|
||||
children?: DeptTable[];
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface DeptForm extends BaseFormType {
|
||||
name?: string;
|
||||
code: string;
|
||||
leader?: string;
|
||||
phone?: string;
|
||||
email?: string;
|
||||
parent_id?: number;
|
||||
order?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
@ -0,0 +1,186 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/system/dict";
|
||||
|
||||
const DictAPI = {
|
||||
listDictType(query: DictPageQuery) {
|
||||
return request<ApiResponse<PageResult<DictTable>>>({
|
||||
url: `${API_PATH}/type/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
optionDictType() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/type/optionselect`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
detailDictType(query: number) {
|
||||
return request<ApiResponse<DictTable>>({
|
||||
url: `${API_PATH}/type/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createDictType(body: DictForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/type/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateDictType(id: number, body: DictForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/type/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteDictType(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/type/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchDictType(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/type/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
exportDictType(body: DictPageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/type/export`,
|
||||
method: "post",
|
||||
data: body,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
|
||||
listDictData(query: DictDataPageQuery) {
|
||||
return request<ApiResponse<PageResult<DictDataTable>>>({
|
||||
url: `${API_PATH}/data/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailDictData(query: number) {
|
||||
return request<ApiResponse<DictDataTable>>({
|
||||
url: `${API_PATH}/data/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createDictData(body: DictDataForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/data/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateDictData(id: number, body: DictDataForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/data/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteDictData(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/data/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchDictData(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/data/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
exportDictData(body: DictDataPageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/data/export`,
|
||||
method: "post",
|
||||
data: body,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
|
||||
getInitDict(dict_type: string) {
|
||||
return request<ApiResponse<DictDataTable[]>>({
|
||||
url: `${API_PATH}/data/info/${dict_type}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default DictAPI;
|
||||
|
||||
export interface DictPageQuery extends PageQuery, UserByQueryParams {
|
||||
dict_name?: string;
|
||||
dict_type?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface DictDataPageQuery extends PageQuery, UserByQueryParams {
|
||||
dict_label?: string;
|
||||
dict_type?: string;
|
||||
dict_type_id?: number;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface DictTable extends BaseType {
|
||||
dict_name?: string;
|
||||
dict_type?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface DictForm extends BaseFormType {
|
||||
dict_name?: string;
|
||||
dict_type?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface DictDataTable extends BaseType {
|
||||
dict_sort?: number;
|
||||
dict_label?: string;
|
||||
dict_value?: string;
|
||||
dict_type_id?: number;
|
||||
dict_type?: string;
|
||||
css_class?: string;
|
||||
list_class?: string;
|
||||
is_default?: boolean;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface DictDataForm extends BaseFormType {
|
||||
dict_sort?: number;
|
||||
dict_label?: string;
|
||||
dict_value?: string;
|
||||
dict_type_id?: number;
|
||||
dict_type?: string;
|
||||
css_class?: string;
|
||||
list_class?: string;
|
||||
is_default?: boolean;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
@ -0,0 +1,105 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
// ==================== 操作日志 ====================
|
||||
|
||||
const OP_API = "/system/log/operation";
|
||||
|
||||
const OperationLogAPI = {
|
||||
list(query?: OperationLogPageQuery) {
|
||||
return request<ApiResponse<PageResult<OperationLogTable>>>({
|
||||
url: `${OP_API}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detail(id: number) {
|
||||
return request<ApiResponse<OperationLogTable>>({
|
||||
url: `${OP_API}/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
delete(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${OP_API}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
export(query?: OperationLogPageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${OP_API}/export`,
|
||||
method: "post",
|
||||
data: query,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default OperationLogAPI;
|
||||
|
||||
export interface OperationLogPageQuery extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
request_path?: string;
|
||||
creator_name?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface OperationLogTable {
|
||||
id: number;
|
||||
tenant_id: number;
|
||||
request_path?: string;
|
||||
request_method?: string;
|
||||
request_payload?: Record<string, unknown> | string;
|
||||
response_code?: number;
|
||||
response_json?: Record<string, unknown> | string;
|
||||
process_time?: string;
|
||||
created_time?: string;
|
||||
}
|
||||
|
||||
// ==================== 登录日志 ====================
|
||||
|
||||
const LOGIN_API = "/system/log/login";
|
||||
|
||||
export const LoginLogAPI = {
|
||||
list(query?: LoginLogPageQuery) {
|
||||
return request<ApiResponse<PageResult<LoginLogTable>>>({
|
||||
url: `${LOGIN_API}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detail(id: number) {
|
||||
return request<ApiResponse<LoginLogTable>>({
|
||||
url: `${LOGIN_API}/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
delete(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${LOGIN_API}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export interface LoginLogPageQuery extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
username?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface LoginLogTable {
|
||||
id: number;
|
||||
username: string;
|
||||
status: number;
|
||||
login_ip?: string;
|
||||
login_location?: string;
|
||||
request_os?: string;
|
||||
request_browser?: string;
|
||||
msg?: string;
|
||||
created_time?: string;
|
||||
}
|
||||
@ -0,0 +1,134 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/system/notice";
|
||||
|
||||
const NoticeAPI = {
|
||||
listNotice(query: NoticePageQuery) {
|
||||
return request<ApiResponse<PageResult<NoticeTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
listNoticeAvailable() {
|
||||
return request<ApiResponse<PageResult<NoticeTable>>>({
|
||||
url: `${API_PATH}/available`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
detailNotice(query: number) {
|
||||
return request<ApiResponse<NoticeTable>>({
|
||||
url: `${API_PATH}/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createNotice(body: NoticeForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateNotice(id: number, body: NoticeForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteNotice(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchNotice(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
exportNotice(body: NoticePageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/export`,
|
||||
method: "post",
|
||||
data: body,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
|
||||
readNotice(id: number) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/read/${id}`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
readAllNotice() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/read-all`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
getUnreadCount() {
|
||||
return request<ApiResponse<number>>({
|
||||
url: `${API_PATH}/unread-count`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
getNotificationPanel() {
|
||||
return request<ApiResponse<NotificationPanel>>({
|
||||
url: `${API_PATH}/panel`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default NoticeAPI;
|
||||
|
||||
export interface NoticePageQuery extends PageQuery, UserByQueryParams {
|
||||
notice_title?: string;
|
||||
notice_type?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface NoticeTable extends BaseType {
|
||||
notice_title?: string;
|
||||
notice_type?: string;
|
||||
notice_content?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface NoticeForm extends BaseFormType {
|
||||
notice_title?: string;
|
||||
notice_type?: string;
|
||||
notice_content?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface NotificationPanelMessage {
|
||||
id?: number;
|
||||
title: string;
|
||||
content?: string;
|
||||
time: string;
|
||||
type?: string;
|
||||
}
|
||||
|
||||
export interface NotificationPanel {
|
||||
notices: NoticeTable[];
|
||||
messages: NotificationPanelMessage[];
|
||||
pendings: NotificationPanelMessage[];
|
||||
}
|
||||
@ -0,0 +1,84 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/system/position";
|
||||
|
||||
const PositionAPI = {
|
||||
listPosition(query?: PositionPageQuery) {
|
||||
return request<ApiResponse<PageResult<PositionTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailPosition(query: number) {
|
||||
return request<ApiResponse<PositionTable>>({
|
||||
url: `${API_PATH}/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createPosition(body: PositionForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updatePosition(id: number, body: PositionForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deletePosition(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchPosition(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
exportPosition(body: PositionPageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/export`,
|
||||
method: "post",
|
||||
data: body,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default PositionAPI;
|
||||
|
||||
export interface PositionPageQuery extends PageQuery, UserByQueryParams {
|
||||
name?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface PositionTable extends BaseType {
|
||||
name?: string;
|
||||
code?: string;
|
||||
order?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface PositionForm extends BaseFormType {
|
||||
name?: string;
|
||||
code?: string;
|
||||
order?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
@ -0,0 +1,120 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/system/role";
|
||||
|
||||
const RoleAPI = {
|
||||
listRole(query?: TablePageQuery) {
|
||||
return request<ApiResponse<PageResult<RoleTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailRole(query: number) {
|
||||
return request<ApiResponse<RoleTable>>({
|
||||
url: `${API_PATH}/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createRole(body: RoleForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateRole(id: number, body: RoleForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteRole(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchRole(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
setPermission(body: permissionDataType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/permission`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
exportRole(body: TablePageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/export`,
|
||||
method: "post",
|
||||
data: body,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default RoleAPI;
|
||||
|
||||
export interface TablePageQuery extends PageQuery, UserByQueryParams {
|
||||
name?: string;
|
||||
}
|
||||
|
||||
export interface RoleTable extends BaseType {
|
||||
name: string;
|
||||
order?: number;
|
||||
code: string;
|
||||
data_scope?: number;
|
||||
menus?: permissionMenuType[];
|
||||
depts?: permissionDeptType[];
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface RoleForm extends BaseFormType {
|
||||
name?: string;
|
||||
order?: number;
|
||||
code: string;
|
||||
data_scope?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface permissionDataType {
|
||||
data_scope: number;
|
||||
role_ids: RoleTable["id"][];
|
||||
menu_ids: permissionMenuType["id"][];
|
||||
dept_ids: permissionDeptType["id"][];
|
||||
}
|
||||
|
||||
export interface permissionDeptType {
|
||||
id: number;
|
||||
name: string;
|
||||
parent_id: number;
|
||||
children: permissionDeptType[];
|
||||
}
|
||||
|
||||
export interface permissionMenuType {
|
||||
id: number;
|
||||
name: string;
|
||||
type: number;
|
||||
permission: string;
|
||||
parent_id?: number;
|
||||
status: number;
|
||||
description?: string;
|
||||
children?: permissionMenuType[];
|
||||
}
|
||||
@ -0,0 +1,90 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/system/ticket";
|
||||
|
||||
const TicketAPI = {
|
||||
listTicket(query?: TicketPageQuery) {
|
||||
return request<ApiResponse<PageResult<TicketTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
detailTicket(id: number) {
|
||||
return request<ApiResponse<TicketTable>>({ url: `${API_PATH}/detail/${id}`, method: "get" });
|
||||
},
|
||||
createTicket(body: TicketCreateForm) {
|
||||
return request<ApiResponse>({ url: `${API_PATH}/create`, method: "post", data: body });
|
||||
},
|
||||
updateTicket(id: number, body: TicketUpdateForm) {
|
||||
return request<ApiResponse>({ url: `${API_PATH}/update/${id}`, method: "put", data: body });
|
||||
},
|
||||
deleteTicket(body: number[]) {
|
||||
return request<ApiResponse>({ url: `${API_PATH}/delete`, method: "delete", data: body });
|
||||
},
|
||||
exportTicket(query?: TicketPageQuery) {
|
||||
return request<ApiResponse<Blob>>({
|
||||
url: `${API_PATH}/export`,
|
||||
method: "get",
|
||||
params: query,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
batchTicket(body: { ids: number[]; status: number }) {
|
||||
return request<ApiResponse>({ url: `${API_PATH}/batch`, method: "put", data: body });
|
||||
},
|
||||
};
|
||||
|
||||
export default TicketAPI;
|
||||
|
||||
export interface TicketPageQuery extends PageQuery, UserByQueryParams {
|
||||
title?: string;
|
||||
ticket_type?: string;
|
||||
assigned_id?: number;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface TicketTable extends BaseType {
|
||||
title: string;
|
||||
ticket_content?: string;
|
||||
summary?: string;
|
||||
ticket_type: string;
|
||||
images?: string;
|
||||
reply?: string;
|
||||
assigned_id?: number;
|
||||
assigned_by?: CommonType;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface TicketCreateForm {
|
||||
title: string;
|
||||
ticket_content?: string;
|
||||
summary?: string;
|
||||
ticket_type: string;
|
||||
images?: string;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface TicketUpdateForm {
|
||||
title?: string;
|
||||
ticket_content?: string;
|
||||
summary?: string;
|
||||
ticket_type?: string;
|
||||
status?: number;
|
||||
reply?: string;
|
||||
assigned_id?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface TicketForm extends BaseFormType {
|
||||
title: string;
|
||||
ticket_content?: string;
|
||||
summary?: string;
|
||||
ticket_type: string;
|
||||
images?: string;
|
||||
reply?: string;
|
||||
assigned_id?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
@ -0,0 +1,283 @@
|
||||
import { request } from "@utils";
|
||||
import { MenuTable, MenuForm } from "@/api/module_platform/menu";
|
||||
|
||||
const API_PATH = "/system/user";
|
||||
|
||||
export const UserAPI = {
|
||||
getCurrentUserInfo() {
|
||||
return request<ApiResponse<UserInfo>>({
|
||||
url: `${API_PATH}/current/info`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
uploadCurrentUserAvatar(body: any) {
|
||||
return request<ApiResponse<UploadFilePath>>({
|
||||
url: `/common/file/upload?upload_type=avatar`,
|
||||
method: "post",
|
||||
data: body,
|
||||
headers: { "Content-Type": "multipart/form-data" },
|
||||
});
|
||||
},
|
||||
|
||||
updateCurrentUserInfo(body: InfoFormState) {
|
||||
return request<ApiResponse<UserInfo>>({
|
||||
url: `${API_PATH}/current/info/update`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
changeCurrentUserPassword(body: PasswordFormState) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/current/password/change`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
resetUserPassword(id: number, body: ResetPasswordForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/password/reset/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
registerUser(body: RegisterForm) {
|
||||
return request<ApiResponse<UserInfo>>({
|
||||
url: `${API_PATH}/register`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
forgetPassword(body: ForgetPasswordForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/password/forget`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
listUser(query: UserPageQuery) {
|
||||
return request<ApiResponse<PageResult<UserInfo>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailUser(id: number) {
|
||||
return request<ApiResponse<UserInfo>>({
|
||||
url: `${API_PATH}/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createUser(body: UserForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateUser(id: number, body: UserForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteUser(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
batchUser(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
exportUser(query: UserPageQuery) {
|
||||
return request<Blob>({
|
||||
url: `${API_PATH}/export`,
|
||||
method: "get",
|
||||
params: query,
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
|
||||
downloadTemplateUser() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/import/template`,
|
||||
method: "get",
|
||||
responseType: "blob",
|
||||
});
|
||||
},
|
||||
|
||||
importUser(body: any) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/import/data`,
|
||||
method: "post",
|
||||
data: body,
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default UserAPI;
|
||||
|
||||
export interface ForgetPasswordForm {
|
||||
username: string;
|
||||
new_password: string;
|
||||
mobile?: string;
|
||||
confirmPassword: string;
|
||||
}
|
||||
|
||||
export interface RegisterForm {
|
||||
username: string;
|
||||
password: string;
|
||||
confirmPassword: string;
|
||||
email?: string;
|
||||
}
|
||||
|
||||
export interface UserPageQuery extends PageQuery, UserByQueryParams, TenantByQueryParams {
|
||||
username?: string;
|
||||
name?: string;
|
||||
mobile?: string;
|
||||
email?: string;
|
||||
dept_id?: number;
|
||||
}
|
||||
|
||||
export interface searchSelectDataType {
|
||||
name?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface UserInfo extends BaseType {
|
||||
username?: string;
|
||||
name?: string;
|
||||
avatar?: string;
|
||||
email?: string;
|
||||
mobile?: string;
|
||||
gender?: string;
|
||||
password?: string;
|
||||
menus?: MenuTable[];
|
||||
dept?: deptTreeType;
|
||||
dept_id?: deptTreeType["id"];
|
||||
dept_name?: deptTreeType["name"];
|
||||
roles?: roleSelectorType[];
|
||||
role_names?: roleSelectorType["name"][];
|
||||
role_ids?: roleSelectorType["id"][];
|
||||
positions?: positionSelectorType[];
|
||||
position_names?: positionSelectorType["name"][];
|
||||
position_ids?: positionSelectorType["id"][];
|
||||
is_superuser?: boolean;
|
||||
last_login?: string;
|
||||
created_by?: CommonType;
|
||||
updated_by?: CommonType;
|
||||
deleted_by?: CommonType;
|
||||
tenant_id?: number;
|
||||
tenant_name?: string;
|
||||
gitee_login?: string;
|
||||
github_login?: string;
|
||||
wx_login?: string;
|
||||
qq_login?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface deptTreeType {
|
||||
id?: number;
|
||||
name?: string;
|
||||
parent_id?: number;
|
||||
children?: deptTreeType[];
|
||||
}
|
||||
|
||||
export interface roleSelectorType {
|
||||
id?: number;
|
||||
name?: string;
|
||||
code?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
menus?: MenuForm[];
|
||||
}
|
||||
|
||||
export interface positionSelectorType {
|
||||
id?: number;
|
||||
name?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface InfoFormState {
|
||||
id?: number;
|
||||
name?: string;
|
||||
gender?: number;
|
||||
mobile?: string;
|
||||
email?: string;
|
||||
username?: string;
|
||||
dept_name?: string;
|
||||
dept?: deptTreeType;
|
||||
positions?: positionSelectorType[];
|
||||
roles?: roleSelectorType[];
|
||||
avatar?: string;
|
||||
created_time?: string;
|
||||
updated_time?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
tenant_by?: { id?: number; name?: string };
|
||||
gitee_login?: string;
|
||||
github_login?: string;
|
||||
wx_login?: string;
|
||||
qq_login?: string;
|
||||
}
|
||||
|
||||
export interface PasswordFormState {
|
||||
old_password: string;
|
||||
new_password: string;
|
||||
confirm_password: string;
|
||||
}
|
||||
|
||||
export interface ResetPasswordForm {
|
||||
password: string;
|
||||
}
|
||||
|
||||
export interface UserForm extends BaseFormType {
|
||||
username?: string;
|
||||
name?: string;
|
||||
dept_id?: number;
|
||||
dept_name?: string;
|
||||
role_ids?: number[];
|
||||
role_names?: string[];
|
||||
position_ids?: number[];
|
||||
position_names?: string[];
|
||||
password?: string;
|
||||
gender?: number;
|
||||
email?: string;
|
||||
mobile?: string;
|
||||
is_superuser?: boolean;
|
||||
avatar?: string;
|
||||
tenant_id?: number;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface CurrentUserFormState {
|
||||
name?: string;
|
||||
gender?: number;
|
||||
mobile?: string;
|
||||
email?: string;
|
||||
avatar?: string;
|
||||
}
|
||||
@ -0,0 +1,154 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/task/cronjob/job";
|
||||
|
||||
const JobAPI = {
|
||||
getSchedulerStatus() {
|
||||
return request<ApiResponse<SchedulerStatus>>({
|
||||
url: `${API_PATH}/scheduler/status`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
getSchedulerJobs() {
|
||||
return request<ApiResponse<SchedulerJob[]>>({
|
||||
url: `${API_PATH}/scheduler/jobs`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
startScheduler() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/scheduler/start`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
pauseScheduler() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/scheduler/pause`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
resumeScheduler() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/scheduler/resume`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
shutdownScheduler() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/scheduler/shutdown`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
clearAllJobs() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/scheduler/jobs/clear`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
getSchedulerConsole() {
|
||||
return request<ApiResponse<string>>({
|
||||
url: `${API_PATH}/scheduler/console`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
syncJobsToDb() {
|
||||
return request<ApiResponse<number>>({
|
||||
url: `${API_PATH}/scheduler/sync`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
pauseJob(jobId: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/task/pause/${jobId}`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
resumeJob(jobId: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/task/resume/${jobId}`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
runJobNow(jobId: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/task/run/${jobId}`,
|
||||
method: "post",
|
||||
});
|
||||
},
|
||||
|
||||
removeJob(jobId: string) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/task/remove/${jobId}`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
getJobLogList(query: JobLogPageQuery) {
|
||||
return request<ApiResponse<PageResult<JobLogTable>>>({
|
||||
url: `${API_PATH}/log/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
getJobLogDetail(id: number) {
|
||||
return request<ApiResponse<JobLogTable>>({
|
||||
url: `${API_PATH}/log/detail/${id}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
deleteJobLog(ids: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/log/delete`,
|
||||
method: "delete",
|
||||
data: ids,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default JobAPI;
|
||||
|
||||
export interface SchedulerStatus {
|
||||
status: string;
|
||||
is_running: boolean;
|
||||
job_count: number;
|
||||
}
|
||||
|
||||
export interface SchedulerJob {
|
||||
id: string;
|
||||
name: string;
|
||||
trigger: string;
|
||||
next_run_time?: string;
|
||||
status: number;
|
||||
}
|
||||
|
||||
export interface JobLogPageQuery extends PageQuery, UserByQueryParams {
|
||||
job_id?: string;
|
||||
job_name?: string;
|
||||
trigger_type?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface JobLogTable extends BaseType {
|
||||
job_id: string;
|
||||
job_name?: string;
|
||||
trigger_type?: string;
|
||||
next_run_time?: string;
|
||||
job_state?: string;
|
||||
result?: string;
|
||||
error?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
@ -0,0 +1,143 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
const API_PATH = "/task/cronjob/node";
|
||||
|
||||
const NodeAPI = {
|
||||
getNodeTypeOptions() {
|
||||
return request<ApiResponse<NodeType[]>>({
|
||||
url: `${API_PATH}/options`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
listNode(query: NodePageQuery) {
|
||||
return request<ApiResponse<PageResult<NodeTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
detailNode(query: number) {
|
||||
return request<ApiResponse<NodeTable>>({
|
||||
url: `${API_PATH}/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createNode(body: NodeForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateNode(id: number, body: NodeForm) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteNode(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
clearNode() {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/clear`,
|
||||
method: "delete",
|
||||
});
|
||||
},
|
||||
|
||||
batchNode(body: BatchType) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/status/batch`,
|
||||
method: "patch",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
executeNode(id: number, params: ExecuteNodeParams = { trigger: "now" }) {
|
||||
return request<ApiResponse<ExecuteNodeResult>>({
|
||||
url: `${API_PATH}/execute/${id}`,
|
||||
method: "post",
|
||||
data: params,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default NodeAPI;
|
||||
|
||||
export interface NodePageQuery extends PageQuery, UserByQueryParams {
|
||||
name?: string;
|
||||
code?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export type TriggerType = "now" | "cron" | "interval" | "date";
|
||||
|
||||
export interface ExecuteNodeParams {
|
||||
trigger: TriggerType;
|
||||
trigger_args?: string;
|
||||
start_date?: string;
|
||||
end_date?: string;
|
||||
}
|
||||
|
||||
export interface ExecuteNodeResult {
|
||||
job_id: number;
|
||||
status: number;
|
||||
trigger: TriggerType;
|
||||
}
|
||||
|
||||
export interface NodeTable extends BaseType {
|
||||
name: string;
|
||||
code: string;
|
||||
jobstore?: string;
|
||||
executor?: string;
|
||||
trigger?: TriggerType;
|
||||
trigger_args?: string;
|
||||
func?: string;
|
||||
args?: string;
|
||||
kwargs?: string;
|
||||
coalesce?: boolean;
|
||||
max_instances?: number;
|
||||
start_date?: string;
|
||||
end_date?: string;
|
||||
created_by?: CommonType;
|
||||
updated_by?: CommonType;
|
||||
deleted_by?: CommonType;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface NodeForm extends BaseFormType {
|
||||
name: string;
|
||||
code?: string;
|
||||
jobstore?: string;
|
||||
executor?: string;
|
||||
func?: string;
|
||||
args?: string;
|
||||
kwargs?: string;
|
||||
coalesce?: boolean;
|
||||
max_instances?: number;
|
||||
start_date?: string;
|
||||
end_date?: string;
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface NodeType {
|
||||
id: number;
|
||||
name: string;
|
||||
code: string;
|
||||
func?: string;
|
||||
args?: string;
|
||||
kwargs?: string;
|
||||
}
|
||||
@ -0,0 +1,110 @@
|
||||
import { request } from "@utils";
|
||||
|
||||
/** 对应后端 `plugin.module_task.workflow.definition` */
|
||||
const API_PATH = "/task/workflow/definition";
|
||||
|
||||
const WorkflowDefinitionAPI = {
|
||||
getWorkflowList(query: WorkflowPageQuery) {
|
||||
return request<ApiResponse<PageResult<WorkflowTable>>>({
|
||||
url: `${API_PATH}/list`,
|
||||
method: "get",
|
||||
params: query,
|
||||
});
|
||||
},
|
||||
|
||||
getWorkflowDetail(query: number) {
|
||||
return request<ApiResponse<WorkflowTable>>({
|
||||
url: `${API_PATH}/detail/${query}`,
|
||||
method: "get",
|
||||
});
|
||||
},
|
||||
|
||||
createWorkflow(body: WorkflowForm) {
|
||||
return request<ApiResponse<WorkflowTable>>({
|
||||
url: `${API_PATH}/create`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
updateWorkflow(id: number, body: WorkflowForm) {
|
||||
return request<ApiResponse<WorkflowTable>>({
|
||||
url: `${API_PATH}/update/${id}`,
|
||||
method: "put",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
deleteWorkflow(body: number[]) {
|
||||
return request<ApiResponse>({
|
||||
url: `${API_PATH}/delete`,
|
||||
method: "delete",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
publishWorkflow(id: number, body: WorkflowPublishForm) {
|
||||
return request<ApiResponse<WorkflowTable>>({
|
||||
url: `${API_PATH}/publish/${id}`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
|
||||
executeWorkflow(body: WorkflowExecuteForm) {
|
||||
return request<ApiResponse<WorkflowExecuteResult>>({
|
||||
url: `${API_PATH}/execute`,
|
||||
method: "post",
|
||||
data: body,
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default WorkflowDefinitionAPI;
|
||||
export { WorkflowDefinitionAPI };
|
||||
|
||||
export interface WorkflowPageQuery extends PageQuery, UserByQueryParams {
|
||||
name?: string;
|
||||
code?: string;
|
||||
status?: number;
|
||||
}
|
||||
|
||||
export interface WorkflowTable extends BaseType {
|
||||
name?: string;
|
||||
code?: string;
|
||||
nodes?: any[];
|
||||
edges?: any[];
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface WorkflowForm extends BaseFormType {
|
||||
name?: string;
|
||||
code?: string;
|
||||
nodes?: any[];
|
||||
edges?: any[];
|
||||
status?: number;
|
||||
description?: string;
|
||||
}
|
||||
|
||||
export interface WorkflowPublishForm {
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface WorkflowExecuteForm {
|
||||
workflow_id: number;
|
||||
variables?: Record<string, any>;
|
||||
business_key?: string;
|
||||
job_id?: number;
|
||||
}
|
||||
|
||||
export interface WorkflowExecuteResult {
|
||||
workflow_id: number;
|
||||
workflow_name: string;
|
||||
status: number;
|
||||
start_time?: string;
|
||||
end_time?: string;
|
||||
variables?: Record<string, any>;
|
||||
node_results?: Record<string, any>;
|
||||
error?: string;
|
||||
}
|
||||
|
After Width: | Height: | Size: 138 KiB |
@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 400 300" fill="none" xmlns="http://www.w3.org/2000/svg"><mask id="a" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="44" y="42" width="312" height="217"><path d="M355.3 42H44v216.9h311.3V42Z" fill="#fff"/></mask><g mask="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M288.2 248.4h25.1v-30h-25.1v30Z" fill="#C7DEFF"/><path fill-rule="evenodd" clip-rule="evenodd" d="M304.498 238.199c-1.5-3.9-5.9-15.4-4-21.6-2.9.8-3.3.1-5-.1-1.7-.1 0 10.7 2.2 16.4 1.7 4.5 2.1 11.1 2.1 13.6h5.4c.2-1.9.3-5.5-.7-8.3Z" fill="#fff"/><path d="M311.5 214.7v-1.6c0-.7-.6-1.3-1.3-1.3h-22.8c-.7 0-1.3.6-1.3 1.3v1.6" fill="#fff"/><path d="M311.5 214.7v-1.6c0-.7-.6-1.3-1.3-1.3h-22.8c-.7 0-1.3.6-1.3 1.3v1.6M290.2 214.7h21.4c1 0 1.8.8 1.8 1.8v29" stroke="#071F4D" stroke-width="1.096"/><path d="M284.3 245.6v-29c0-1 .8-1.8 1.8-1.8h1.6" fill="#fff"/><path d="M284.3 245.6v-29c0-1 .8-1.8 1.8-1.8h1.6" stroke="#071F4D" stroke-width="1.096"/><path d="M295.402 216.5c-.9 4.2-.4 9.7 2.8 17.5 2.4 5.9 1.9 10.2 1.8 12.3M300.502 216.5c-.9 4.2-.4 9.7 2.8 17.5 2.4 5.9 1.9 10.2 1.8 12.3" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="m331 258.4-.3-5.2H88.5l-1.2 5.2H331Z" fill="#C7DEFF"/><path d="M252.9 248.7H331M216.6 258.4H331M47.1 139.3l-2.6 1.5 42.7 117.6h129.2v-6.6" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="m247.2 248.6-40.4-111.3H50.5l40.3 111.3h156.4Z" fill="#fff"/><path d="m247.2 248.6-40.4-111.3H50.5l40.3 111.3h156.4Z" stroke="#071F4D"/><path d="m203.2 153.2 32.2 88.7H97.8l-32.3-88.7" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M72.2 146.9c-.77 0-1.4.63-1.4 1.4 0 .77.63 1.4 1.4 1.4.77 0 1.4-.63 1.4-1.4 0-.77-.63-1.4-1.4-1.4ZM79.3 146.9c-.77 0-1.4.63-1.4 1.4 0 .77.63 1.4 1.4 1.4.77 0 1.4-.63 1.4-1.4 0-.77-.63-1.4-1.4-1.4Z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M263.5 171.2h80.3v-63.7h-80.3v63.7Z" fill="#C7DEFF"/><path fill-rule="evenodd" clip-rule="evenodd" d="M290 143.9h-45.6l12.5 51.3H290v-51.3Z" fill="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M286 117.4h-29.3v77.8h92.9v-67.6l-55.9.6-7.7-10.8Z" fill="#00E4E5"/><path d="m332.6 127.6-38.9.6-7.7-10.8h-11.7M308.9 195.2h45.9M250.3 195.2h28.5M287.3 195.2h12.3" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M130.5 211.4H186v-44h-55.5v44Z" fill="#C7DEFF"/><path fill-rule="evenodd" clip-rule="evenodd" d="M148.7 192.5h-31.6l8.7 35.5h22.9v-35.5Z" fill="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M145.9 174.2h-20.2V228h64.1v-46.7l-38.6.4-5.3-7.5Z" fill="#006EFF"/><path d="m179 181.3-27.8.4-5.3-7.5h-7.7M176.2 201.7h19.2M163.2 210.7H195M172.1 228h-54.2M184.8 228h8.1M174.9 228h5.4" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="m293.2 155.7-6.4 6.3 15.3 15.3 22.7-22.6-6.4-6.4-16.3 16.3-8.9-8.9Z" fill="#fff"/><path d="M57.2 258.4h283.6M345.9 258.4h8.1M55.4 258.4h220.5M160.1 118.8l-1.2 2.7M156.7 127c-.3.8-.7 1.8-1.1 2.8M222 68.5c-1 .2-1.9.5-2.9.8M214.1 70.7c-5.8 1.9-11.3 4.4-16.5 7.4M195.4 79.5c-.9.5-1.7 1.1-2.5 1.6M314.2 98.5c-.6-.8-1.3-1.5-2-2.3M308.9 92.8c-4-4-8.3-7.6-13-10.8M293.9 80.7c-.8-.5-1.7-1.1-2.5-1.6" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M251.296 71.203c-3.6-1.5-18.5-2.9-21.8-1.9-1 5.8 4.9 13.5 4.9 13.5s6-9.9 16.9-11.6Z" fill="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M251.3 42.704c-6.5 6.7-7.8 13-8.8 19.3 24.4-1.1 36.3 13 42.8 20 3.2-9.1 7.8-23 7.2-29-7.1-6.4-20-11.7-41.2-10.3Z" fill="#C7DEFF"/><path d="M230 69.3c36.2-3.8 52 21.1 52 21.1s11.4-28.2 10.5-37.4c-7.3-6.5-23.3-12-45.6-10.1-9 6.3-15.6 18.7-16.9 26.4Z" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M161.604 70.7c-6 8.4-9.9 21.9-8.8 33.8 8.4 5.3 32.3 10.5 43.6 11.5 6.1-7.9 15.9-26 15.9-26s-32-4.8-50.7-19.3Z" fill="#C7DEFF"/><path d="M193.103 119.5c4.8-2.7 19.2-29.5 19.2-29.5s-35.8-5.4-53.7-21.8c-9.3 6.1-16.4 24.3-15 40.1 10.6 6.7 45.8 13.3 49.5 11.2Z" stroke="#071F4D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M189.5 111.6c-3 5.2-5.7 7.2-9.8 6.6 12.2 2.6 13.5 1.2 15.6-1.1 2.2-2.4 4.2-6.6 4.2-6.6s-3.1 2.5-10 1.1Z" fill="#071F4D"/><path d="M331 251.8v6.6M77 165.4l-2.7-6.7h7.8M222.8 228.9l2.8 6.6h-7.9" stroke="#071F4D"/></g></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
@ -0,0 +1,70 @@
|
||||
<svg width="695" height="695" viewBox="195 164.5 695 695" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="white"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="#ECEFFF"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint0_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint1_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint2_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint3_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="white"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="#ECEFFF"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint4_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint5_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint6_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint7_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="white"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="#ECEFFF"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint8_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint9_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint10_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint11_radial_402_5926)"/>
|
||||
<defs>
|
||||
<radialGradient id="paint0_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-137.956 -387.324 387.315 -228.814 483.689 731.186)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint1_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-140.464 -366.075 365.281 -152.396 447.03 691.661)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint2_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-111.514 -277.545 374.955 -279.04 405.025 738.373)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint3_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-190.674 -263.482 350.863 -361.721 469.942 706.034)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint4_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-186.573 -387.324 523.807 -228.814 804.163 731.186)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint5_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-189.964 -366.075 494.008 -152.396 754.585 691.661)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint6_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-150.813 -277.545 507.091 -279.04 697.777 738.373)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint7_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-257.868 -263.482 474.509 -361.721 785.571 706.034)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint8_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-143.901 -163.816 404.006 -96.7753 707.774 729.368)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint9_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-146.517 -154.829 381.023 -64.455 669.536 712.651)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint10_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-116.32 -117.386 391.113 -118.018 625.721 732.407)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint11_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-198.891 -111.438 365.983 -152.988 693.435 718.729)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,70 @@
|
||||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="white"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="#ECEFFF"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint0_radial_402_5772)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint1_radial_402_5772)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint2_radial_402_5772)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint3_radial_402_5772)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="white"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="#ECEFFF"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint4_radial_402_5772)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint5_radial_402_5772)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint6_radial_402_5772)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint7_radial_402_5772)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="white"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="#ECEFFF"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint8_radial_402_5772)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint9_radial_402_5772)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint10_radial_402_5772)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint11_radial_402_5772)"/>
|
||||
<defs>
|
||||
<radialGradient id="paint0_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-112.689 -593.187 613.696 -244.529 483.689 731.187)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint1_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-140.464 -366.075 365.281 -152.396 447.03 691.661)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint2_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-111.514 -277.545 374.955 -279.04 405.025 738.373)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint3_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-190.674 -263.482 350.863 -361.721 469.942 706.034)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint4_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-227.163 -513.187 693.033 -276.545 804.163 731.187)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint5_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-189.964 -366.075 494.008 -152.396 754.585 691.661)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint6_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-150.813 -277.545 507.091 -279.04 697.777 738.373)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint7_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-257.868 -263.482 474.509 -361.721 785.571 706.034)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint8_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-143.901 -163.816 404.006 -96.7753 707.774 729.368)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint9_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-146.517 -154.829 381.023 -64.455 669.536 712.651)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint10_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-116.32 -117.386 391.113 -118.018 625.721 732.407)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint11_radial_402_5772" cx="0" cy="0" r="1" gradientTransform="matrix(-198.891 -111.438 365.983 -152.988 693.435 718.729)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,70 @@
|
||||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="white"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="#ECEFFF"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint0_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint1_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint2_radial_402_5926)"/>
|
||||
<path d="M498.848 411.545C497.534 414.363 494.707 416.164 491.598 416.164H321.164C315.641 416.164 311.164 420.641 311.164 426.164V502C311.164 507.523 315.641 512 321.164 512H439.448C445.3 512 449.172 518.077 446.699 523.381L399.992 623.545C398.678 626.363 395.85 628.164 392.741 628.164H321.164C315.641 628.164 311.164 632.641 311.164 638.164V716C311.164 720.418 307.582 724 303.164 724H203C198.582 724 195 720.418 195 716V310C195 304.477 199.477 300 205 300H538.305C544.157 300 548.028 306.077 545.555 311.381L498.848 411.545Z" fill="url(#paint3_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="white"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="#ECEFFF"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint4_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint5_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint6_radial_402_5926)"/>
|
||||
<path d="M688.908 560.322C686.291 554.709 690.77 548.423 696.893 549.353C757.064 558.491 810.471 588.221 849.703 631.13C850.244 631.721 850.689 632.392 851.027 633.118L888.099 712.619C890.572 717.923 886.701 724 880.849 724H770.33C767.221 724 764.393 722.199 763.079 719.381L688.908 560.322ZM518.744 719.381C517.43 722.199 514.602 724 511.493 724H421.614C416.148 724 412.297 718.637 414.255 713.534C442.643 639.551 503.816 581.812 579.989 558.107C586.39 556.114 591.818 562.67 588.985 568.746L518.744 719.381ZM704.825 319.586C704.844 319.626 704.877 319.659 704.917 319.678L704.956 319.696C705.03 319.731 705.062 319.819 705.027 319.893C705.009 319.933 705.009 319.979 705.027 320.019L807.477 539.725C810.905 547.077 802.133 554.798 794.992 550.951C758.455 531.27 717.22 519.187 673.402 516.817C670.405 516.655 667.72 514.883 666.451 512.163L648.161 472.939C645.29 466.781 636.532 466.781 633.66 472.939L613.528 516.112C612.404 518.523 610.151 520.21 607.53 520.664C559.993 528.902 516.417 548.698 479.804 577.052C472.49 582.716 458.831 572.994 462.741 564.609L576.796 320.02C576.814 319.98 576.814 319.934 576.795 319.894C576.761 319.819 576.793 319.73 576.867 319.695L576.906 319.677C576.947 319.658 576.98 319.625 576.999 319.584L583.978 304.619C585.292 301.801 588.119 300 591.228 300H690.596C693.705 300 696.532 301.801 697.846 304.619L704.825 319.586Z" fill="url(#paint7_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="white"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="#ECEFFF"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint8_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint9_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint10_radial_402_5926)"/>
|
||||
<path d="M656.303 547C697.059 547 735.69 556.094 770.28 572.362C775.259 574.704 773.176 582.062 767.674 582.062C666.005 582.062 577.554 638.65 532.097 722.047C530.671 724.664 527.945 726.328 524.965 726.328H414.524C409.01 726.328 405.156 720.88 407.2 715.76C446.677 616.873 543.33 547 656.303 547Z" fill="url(#paint11_radial_402_5926)"/>
|
||||
<defs>
|
||||
<radialGradient id="paint0_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-137.956 -387.324 387.315 -228.814 483.689 731.186)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint1_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-140.464 -366.075 365.281 -152.396 447.03 691.661)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint2_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-111.514 -277.545 374.955 -279.04 405.025 738.373)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint3_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-190.674 -263.482 350.863 -361.721 469.942 706.034)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint4_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-186.573 -387.324 523.807 -228.814 804.163 731.186)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint5_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-189.964 -366.075 494.008 -152.396 754.585 691.661)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint6_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-150.813 -277.545 507.091 -279.04 697.777 738.373)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint7_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-257.868 -263.482 474.509 -361.721 785.571 706.034)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint8_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-143.901 -163.816 404.006 -96.7753 707.774 729.368)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.634139" stop-color="#1629FF"/>
|
||||
<stop offset="1" stop-color="#A274FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint9_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-146.517 -154.829 381.023 -64.455 669.536 712.651)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.493539" stop-color="#8258FF"/>
|
||||
<stop offset="1" stop-color="#8258FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint10_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-116.32 -117.386 391.113 -118.018 625.721 732.407)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="1" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="paint11_radial_402_5926" cx="0" cy="0" r="1" gradientTransform="matrix(-198.891 -111.438 365.983 -152.988 693.435 718.729)" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#59B2FF"/>
|
||||
<stop offset="0.690597" stop-color="#5EB4FF" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 954 B |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 726 B |
|
After Width: | Height: | Size: 944 B |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 810 B |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 1.6 KiB |