first commit
28
.gitignore
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
.DS_Store
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
**/*.log
|
||||||
|
**/*.tgz
|
||||||
|
|
||||||
|
tests/**/coverage/
|
||||||
|
tests/e2e/reports
|
||||||
|
selenium-debug.log
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.local
|
||||||
|
|
||||||
|
|
||||||
|
package-lock.json
|
||||||
|
yarn.lock
|
||||||
|
|
||||||
|
.history
|
||||||
|
|
||||||
20
LICENSE
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2018 RuoYi
|
||||||
|
|
||||||
|
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.
|
||||||
5
README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# @cmvr/iot-common
|
||||||
|
|
||||||
|
CMVR IoT applications share their application shell, permissions, common components and reusable business pages through this package.
|
||||||
|
|
||||||
|
Each host must call `configureCmvrCommon` before mounting Vue. API endpoints, authentication cookies and browser storage remain isolated per application.
|
||||||
77
package.json
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
"name": "@cmvr/iot-common",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "CMVR IoT shared frontend runtime and business modules",
|
||||||
|
"author": {
|
||||||
|
"name": "zhanghao",
|
||||||
|
"email": "774378400@qq.com"
|
||||||
|
},
|
||||||
|
"type": "module",
|
||||||
|
"license": "UNLICENSED",
|
||||||
|
"private": false,
|
||||||
|
"main": "./dist/index.js",
|
||||||
|
|
||||||
|
"module": "./dist/index.js",
|
||||||
|
"exports": {
|
||||||
|
".": "./dist/index.js",
|
||||||
|
"./style.css": "./dist/style.css"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"dist",
|
||||||
|
"README.md"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build": "vite build",
|
||||||
|
"prepublishOnly": "pnpm build"
|
||||||
|
},
|
||||||
|
"publishConfig": {
|
||||||
|
"registry": "http://192.168.28.10:4873/",
|
||||||
|
"access": "restricted"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@element-plus/icons-vue": "^2.3.2",
|
||||||
|
"element-plus": "^2.13.1",
|
||||||
|
"pinia": "^3.0.4",
|
||||||
|
"vue": "^3.5.26",
|
||||||
|
"vue-router": "^4.6.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@vue-flow/background": "^1.3.2",
|
||||||
|
"@vue-flow/controls": "^1.1.3",
|
||||||
|
"@vue-flow/core": "^1.48.2",
|
||||||
|
"@vueup/vue-quill": "1.2.0",
|
||||||
|
"@vueuse/core": "14.1.0",
|
||||||
|
"ace-builds": "^1.43.0",
|
||||||
|
"axios": "1.13.2",
|
||||||
|
"clipboard": "2.0.11",
|
||||||
|
"dayjs": "^1.11.13",
|
||||||
|
"echarts": "5.6.0",
|
||||||
|
"file-saver": "2.0.5",
|
||||||
|
"fuse.js": "7.1.0",
|
||||||
|
"js-beautify": "1.15.4",
|
||||||
|
"js-cookie": "3.0.5",
|
||||||
|
"jsencrypt": "3.3.2",
|
||||||
|
"json-editor-vue": "^0.18.1",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"mitt": "^3.0.1",
|
||||||
|
"monaco-editor": "^0.55.1",
|
||||||
|
"nprogress": "0.2.0",
|
||||||
|
"pako": "^2.1.0",
|
||||||
|
"sortablejs": "^1.15.6",
|
||||||
|
"splitpanes": "3.1.5",
|
||||||
|
"uuid": "^11.1.0",
|
||||||
|
"vue-cropper": "1.1.1",
|
||||||
|
"vue3-ace-editor": "^2.2.4",
|
||||||
|
"vue3-json-viewer": "2.3.0",
|
||||||
|
"vuedraggable": "4.1.0",
|
||||||
|
"xgplayer": "^3.0.22"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@vitejs/plugin-vue": "5.2.4",
|
||||||
|
"sass-embedded": "1.97.2",
|
||||||
|
"unplugin-auto-import": "0.18.6",
|
||||||
|
"unplugin-vue-setup-extend-plus": "1.0.1",
|
||||||
|
"vite": "6.4.1"
|
||||||
|
},
|
||||||
|
"packageManager": "pnpm@10.24.0"
|
||||||
|
}
|
||||||
3681
pnpm-lock.yaml
generated
Normal file
461
src/adapters/URDFAdapter.js
Normal file
@ -0,0 +1,461 @@
|
|||||||
|
/**
|
||||||
|
* URDF Adapter
|
||||||
|
* Converts urdf-loaders result to unified model
|
||||||
|
*/
|
||||||
|
import * as THREE from 'three';
|
||||||
|
import { UnifiedRobotModel, Link, Joint, JointLimits, VisualGeometry, CollisionGeometry, InertialProperties } from '@/models/UnifiedRobotModel.js';
|
||||||
|
|
||||||
|
export class URDFAdapter {
|
||||||
|
/**
|
||||||
|
* Convert urdf-loaders robot object to unified model
|
||||||
|
* @param {THREE.Group} robot - Robot object returned by urdf-loaders
|
||||||
|
* @param {string} urdfXML - Original URDF XML content (optional, for extracting inertial data)
|
||||||
|
* @returns {UnifiedRobotModel}
|
||||||
|
*/
|
||||||
|
static convert(robot, urdfXML = null) {
|
||||||
|
const model = new UnifiedRobotModel();
|
||||||
|
model.name = robot.name || 'robot';
|
||||||
|
model.threeObject = robot;
|
||||||
|
|
||||||
|
// Mark model type as URDF
|
||||||
|
if (!robot.userData) robot.userData = {};
|
||||||
|
robot.userData.type = 'urdf';
|
||||||
|
|
||||||
|
if (!robot.links || !robot.joints) {
|
||||||
|
console.warn('URDF model missing links or joints information');
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If XML provided, parse inertial data
|
||||||
|
let inertialData = {};
|
||||||
|
if (urdfXML) {
|
||||||
|
inertialData = this.parseInertialFromXML(urdfXML);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert links
|
||||||
|
Object.values(robot.links).forEach(urdfLink => {
|
||||||
|
const link = this.convertLink(urdfLink);
|
||||||
|
|
||||||
|
// If urdf-loader didn't parse inertial, get from XML
|
||||||
|
if (!link.inertial && inertialData[urdfLink.name]) {
|
||||||
|
link.inertial = inertialData[urdfLink.name];
|
||||||
|
}
|
||||||
|
|
||||||
|
model.addLink(link);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Convert joints
|
||||||
|
Object.values(robot.joints).forEach(urdfJoint => {
|
||||||
|
const joint = this.convertJoint(urdfJoint);
|
||||||
|
model.addJoint(joint);
|
||||||
|
});
|
||||||
|
|
||||||
|
// If XML provided, supplement effort and velocity from XML (urdf-loaders may not have parsed)
|
||||||
|
if (urdfXML) {
|
||||||
|
this.supplementJointLimitsFromXML(model, urdfXML);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find root link (link that is not a child of any joint)
|
||||||
|
const allChildren = new Set(
|
||||||
|
Array.from(model.joints.values()).map(j => j.child).filter(c => c)
|
||||||
|
);
|
||||||
|
const rootLinks = Array.from(model.links.keys()).filter(
|
||||||
|
name => !allChildren.has(name)
|
||||||
|
);
|
||||||
|
if (rootLinks.length > 0) {
|
||||||
|
model.rootLink = rootLinks[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enhance materials for better lighting (MuJoCo style)
|
||||||
|
this.enhanceMaterials(robot);
|
||||||
|
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enhance materials for better lighting (MuJoCo style)
|
||||||
|
* Applies consistent shininess and specular properties to all materials
|
||||||
|
* Directly modifies materials in place to ensure changes persist
|
||||||
|
*/
|
||||||
|
static enhanceMaterials(robotObject) {
|
||||||
|
robotObject.traverse((child) => {
|
||||||
|
if (child.isMesh && child.material) {
|
||||||
|
// Handle material arrays
|
||||||
|
if (Array.isArray(child.material)) {
|
||||||
|
child.material = child.material.map(mat => {
|
||||||
|
return this.enhanceSingleMaterial(mat);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
child.material = this.enhanceSingleMaterial(child.material);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enhance a single material with better lighting properties
|
||||||
|
* Returns enhanced material (may be cloned or modified in place)
|
||||||
|
* Saves original properties for lighting toggle
|
||||||
|
*/
|
||||||
|
static enhanceSingleMaterial(material) {
|
||||||
|
if (material.isMeshPhongMaterial || material.isMeshStandardMaterial) {
|
||||||
|
// Save original properties if not already saved (for lighting toggle)
|
||||||
|
if (material.userData.originalShininess === undefined) {
|
||||||
|
material.userData.originalShininess = material.shininess !== undefined ? material.shininess : 30;
|
||||||
|
// IMPORTANT: Save original color to preserve URDF material colors
|
||||||
|
if (!material.userData.originalColor && material.color) {
|
||||||
|
material.userData.originalColor = material.color.clone();
|
||||||
|
}
|
||||||
|
// Save original specular - if material had no specular, save null
|
||||||
|
if (!material.specular) {
|
||||||
|
material.userData.originalSpecular = null;
|
||||||
|
} else if (material.specular.isColor) {
|
||||||
|
const spec = material.specular;
|
||||||
|
if (spec.r < 0.1 && spec.g < 0.1 && spec.b < 0.1) {
|
||||||
|
material.userData.originalSpecular = null; // Likely default
|
||||||
|
} else {
|
||||||
|
material.userData.originalSpecular = spec.clone();
|
||||||
|
}
|
||||||
|
} else if (typeof material.specular === 'number') {
|
||||||
|
if (material.specular === 0x111111 || material.specular < 0x111111) {
|
||||||
|
material.userData.originalSpecular = null;
|
||||||
|
} else {
|
||||||
|
material.userData.originalSpecular = new THREE.Color(material.specular);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
material.userData.originalSpecular = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IMPORTANT: Preserve original color from URDF material definitions
|
||||||
|
// Do not modify material.color - urdf-loaders already sets the correct color
|
||||||
|
|
||||||
|
// Apply enhanced lighting (default enabled)
|
||||||
|
// Increase shininess for better highlights
|
||||||
|
if (material.shininess === undefined || material.shininess < 50) {
|
||||||
|
material.shininess = 50;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enhance specular reflection - ensure it's a Color object with proper values
|
||||||
|
if (!material.specular) {
|
||||||
|
material.specular = new THREE.Color(0.3, 0.3, 0.3);
|
||||||
|
} else if (material.specular.isColor) {
|
||||||
|
// If it's already a Color object, update values
|
||||||
|
if (material.specular.r < 0.2 || material.specular.g < 0.2 || material.specular.b < 0.2) {
|
||||||
|
material.specular.setRGB(0.3, 0.3, 0.3);
|
||||||
|
}
|
||||||
|
} else if (typeof material.specular === 'number') {
|
||||||
|
// Convert number to Color object
|
||||||
|
if (material.specular < 0x333333) {
|
||||||
|
material.specular = new THREE.Color(0.3, 0.3, 0.3);
|
||||||
|
} else {
|
||||||
|
// Convert hex to Color
|
||||||
|
material.specular = new THREE.Color(material.specular);
|
||||||
|
if (material.specular.r < 0.2) {
|
||||||
|
material.specular.setRGB(0.3, 0.3, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark material as needing update
|
||||||
|
material.needsUpdate = true;
|
||||||
|
return material;
|
||||||
|
} else if (material.type === 'MeshBasicMaterial') {
|
||||||
|
// Convert MeshBasicMaterial to MeshPhongMaterial
|
||||||
|
const oldMaterial = material;
|
||||||
|
const envMap = typeof window !== 'undefined' && window.app?.sceneManager?.environmentManager?.getEnvironmentMap();
|
||||||
|
const newMaterial = new THREE.MeshPhongMaterial({
|
||||||
|
color: oldMaterial.color,
|
||||||
|
map: oldMaterial.map,
|
||||||
|
transparent: oldMaterial.transparent,
|
||||||
|
opacity: oldMaterial.opacity,
|
||||||
|
side: oldMaterial.side,
|
||||||
|
shininess: 50,
|
||||||
|
specular: new THREE.Color(0.3, 0.3, 0.3),
|
||||||
|
envMap: envMap || null,
|
||||||
|
reflectivity: envMap ? 0.3 : 0
|
||||||
|
});
|
||||||
|
// Save original properties for lighting toggle
|
||||||
|
newMaterial.userData.originalShininess = 30;
|
||||||
|
newMaterial.userData.originalSpecular = null; // MeshBasicMaterial had no specular
|
||||||
|
return newMaterial;
|
||||||
|
}
|
||||||
|
|
||||||
|
return material;
|
||||||
|
}
|
||||||
|
|
||||||
|
static convertLink(urdfLink) {
|
||||||
|
const link = new Link(urdfLink.name);
|
||||||
|
link.threeObject = urdfLink;
|
||||||
|
|
||||||
|
// Convert inertial properties
|
||||||
|
if (urdfLink.inertial) {
|
||||||
|
link.inertial = this.convertInertial(urdfLink.inertial);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: urdf-loaders has already converted visual and collision to Three.js objects
|
||||||
|
// We mainly extract metadata, actual meshes are in threeObject
|
||||||
|
|
||||||
|
return link;
|
||||||
|
}
|
||||||
|
|
||||||
|
static convertJoint(urdfJoint) {
|
||||||
|
// URDF joint object has jointType property (not type)
|
||||||
|
const jointType = urdfJoint.jointType || urdfJoint.type || 'fixed';
|
||||||
|
const joint = new Joint(urdfJoint.name, jointType);
|
||||||
|
|
||||||
|
// Extract parent name (urdf-loader returns Three.js object reference)
|
||||||
|
joint.parent = urdfJoint.parent?.name || null;
|
||||||
|
|
||||||
|
// child may not be in urdfJoint.child, but in Three.js children array
|
||||||
|
// In Three.js scene graph, Joint is parent node, Child Link is Joint's child node
|
||||||
|
if (urdfJoint.child && urdfJoint.child.name) {
|
||||||
|
joint.child = urdfJoint.child.name;
|
||||||
|
} else if (urdfJoint.children && urdfJoint.children.length > 0) {
|
||||||
|
// Find Link object from children array
|
||||||
|
const childLink = urdfJoint.children.find(child =>
|
||||||
|
child.isURDFLink || child.type === 'URDFLink'
|
||||||
|
);
|
||||||
|
if (childLink) {
|
||||||
|
joint.child = childLink.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
joint.threeObject = urdfJoint;
|
||||||
|
|
||||||
|
// Convert origin
|
||||||
|
if (urdfJoint.origin) {
|
||||||
|
joint.origin = {
|
||||||
|
xyz: urdfJoint.origin.xyz || [0, 0, 0],
|
||||||
|
rpy: urdfJoint.origin.rpy || [0, 0, 0]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert axis
|
||||||
|
if (urdfJoint.axis) {
|
||||||
|
joint.axis = { xyz: urdfJoint.axis.xyz || [0, 0, 1] };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert limits
|
||||||
|
if (urdfJoint.limit) {
|
||||||
|
joint.limits = this.convertLimits(urdfJoint.limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current value
|
||||||
|
if (urdfJoint.angle !== undefined) {
|
||||||
|
joint.currentValue = urdfJoint.angle;
|
||||||
|
} else if (urdfJoint.jointValue !== undefined) {
|
||||||
|
joint.currentValue = urdfJoint.jointValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return joint;
|
||||||
|
}
|
||||||
|
|
||||||
|
static convertLimits(limit) {
|
||||||
|
const limits = new JointLimits();
|
||||||
|
if (limit.lower !== undefined) limits.lower = limit.lower;
|
||||||
|
if (limit.upper !== undefined) limits.upper = limit.upper;
|
||||||
|
if (limit.effort !== undefined) limits.effort = limit.effort;
|
||||||
|
if (limit.velocity !== undefined) limits.velocity = limit.velocity;
|
||||||
|
return limits;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supplement joint effort and velocity information from URDF XML
|
||||||
|
* (because urdf-loaders may not have parsed these attributes)
|
||||||
|
*/
|
||||||
|
static supplementJointLimitsFromXML(model, urdfXML) {
|
||||||
|
try {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const doc = parser.parseFromString(urdfXML, 'text/xml');
|
||||||
|
|
||||||
|
const jointElements = doc.querySelectorAll('joint');
|
||||||
|
jointElements.forEach(jointEl => {
|
||||||
|
const jointName = jointEl.getAttribute('name');
|
||||||
|
const joint = model.joints.get(jointName);
|
||||||
|
|
||||||
|
if (joint) {
|
||||||
|
const limitEl = jointEl.querySelector('limit');
|
||||||
|
if (limitEl) {
|
||||||
|
if (!joint.limits) {
|
||||||
|
joint.limits = new JointLimits();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read effort and velocity
|
||||||
|
const effort = limitEl.getAttribute('effort');
|
||||||
|
const velocity = limitEl.getAttribute('velocity');
|
||||||
|
|
||||||
|
if (effort !== null) {
|
||||||
|
joint.limits.effort = parseFloat(effort);
|
||||||
|
}
|
||||||
|
if (velocity !== null) {
|
||||||
|
joint.limits.velocity = parseFloat(velocity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also ensure lower and upper are correctly set
|
||||||
|
const lower = limitEl.getAttribute('lower');
|
||||||
|
const upper = limitEl.getAttribute('upper');
|
||||||
|
if (lower !== null) {
|
||||||
|
joint.limits.lower = parseFloat(lower);
|
||||||
|
}
|
||||||
|
if (upper !== null) {
|
||||||
|
joint.limits.upper = parseFloat(upper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to supplement joint limit information from XML:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static convertInertial(inertial) {
|
||||||
|
const props = new InertialProperties();
|
||||||
|
if (inertial.mass !== undefined) props.mass = inertial.mass;
|
||||||
|
if (inertial.origin) {
|
||||||
|
props.origin = {
|
||||||
|
xyz: inertial.origin.xyz || [0, 0, 0],
|
||||||
|
rpy: inertial.origin.rpy || [0, 0, 0]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (inertial.ixx !== undefined) props.ixx = inertial.ixx;
|
||||||
|
if (inertial.iyy !== undefined) props.iyy = inertial.iyy;
|
||||||
|
if (inertial.izz !== undefined) props.izz = inertial.izz;
|
||||||
|
if (inertial.ixy !== undefined) props.ixy = inertial.ixy;
|
||||||
|
if (inertial.ixz !== undefined) props.ixz = inertial.ixz;
|
||||||
|
if (inertial.iyz !== undefined) props.iyz = inertial.iyz;
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse inertial data from URDF XML
|
||||||
|
* @param {string} xmlContent - URDF XML content
|
||||||
|
* @returns {Object} Mapping from link names to inertial data
|
||||||
|
*/
|
||||||
|
static parseInertialFromXML(xmlContent) {
|
||||||
|
const inertialData = {};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const xmlDoc = parser.parseFromString(xmlContent, 'text/xml');
|
||||||
|
|
||||||
|
// Get all link elements
|
||||||
|
const links = xmlDoc.getElementsByTagName('link');
|
||||||
|
|
||||||
|
for (let i = 0; i < links.length; i++) {
|
||||||
|
const linkElement = links[i];
|
||||||
|
const linkName = linkElement.getAttribute('name');
|
||||||
|
|
||||||
|
// Find inertial element
|
||||||
|
const inertialElement = linkElement.getElementsByTagName('inertial')[0];
|
||||||
|
if (!inertialElement) continue;
|
||||||
|
|
||||||
|
const inertial = new InertialProperties();
|
||||||
|
|
||||||
|
// Parse mass
|
||||||
|
const massElement = inertialElement.getElementsByTagName('mass')[0];
|
||||||
|
if (massElement) {
|
||||||
|
inertial.mass = parseFloat(massElement.getAttribute('value'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse origin
|
||||||
|
const originElement = inertialElement.getElementsByTagName('origin')[0];
|
||||||
|
if (originElement) {
|
||||||
|
const xyz = originElement.getAttribute('xyz');
|
||||||
|
const rpy = originElement.getAttribute('rpy');
|
||||||
|
inertial.origin = {
|
||||||
|
xyz: xyz ? xyz.split(' ').map(parseFloat) : [0, 0, 0],
|
||||||
|
rpy: rpy ? rpy.split(' ').map(parseFloat) : [0, 0, 0]
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
inertial.origin = { xyz: [0, 0, 0], rpy: [0, 0, 0] };
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse inertia
|
||||||
|
const inertiaElement = inertialElement.getElementsByTagName('inertia')[0];
|
||||||
|
if (inertiaElement) {
|
||||||
|
inertial.ixx = parseFloat(inertiaElement.getAttribute('ixx')) || 0;
|
||||||
|
inertial.iyy = parseFloat(inertiaElement.getAttribute('iyy')) || 0;
|
||||||
|
inertial.izz = parseFloat(inertiaElement.getAttribute('izz')) || 0;
|
||||||
|
inertial.ixy = parseFloat(inertiaElement.getAttribute('ixy')) || 0;
|
||||||
|
inertial.ixz = parseFloat(inertiaElement.getAttribute('ixz')) || 0;
|
||||||
|
inertial.iyz = parseFloat(inertiaElement.getAttribute('iyz')) || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inertialData[linkName] = inertial;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to parse URDF XML inertial data:', error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return inertialData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set joint angle (using urdf-loaders' setJointValue method)
|
||||||
|
* Reference URDFClasses.js setJointValue implementation
|
||||||
|
*/
|
||||||
|
static setJointAngle(joint, angle, ignoreLimits = false) {
|
||||||
|
joint.currentValue = angle;
|
||||||
|
|
||||||
|
// URDF format: use urdf-loader's setJointValue method
|
||||||
|
if (joint.threeObject) {
|
||||||
|
// If ignoring limits, temporarily modify URDF joint object's limit values
|
||||||
|
let originalLimits = null;
|
||||||
|
if (ignoreLimits && joint.threeObject.limit) {
|
||||||
|
originalLimits = {
|
||||||
|
lower: joint.threeObject.limit.lower,
|
||||||
|
upper: joint.threeObject.limit.upper
|
||||||
|
};
|
||||||
|
joint.threeObject.limit.lower = -Math.PI * 2;
|
||||||
|
joint.threeObject.limit.upper = Math.PI * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prefer setJointValue method (urdf-loader's standard method)
|
||||||
|
if (typeof joint.threeObject.setJointValue === 'function') {
|
||||||
|
joint.threeObject.setJointValue(angle);
|
||||||
|
|
||||||
|
// Restore original limits
|
||||||
|
if (originalLimits && joint.threeObject.limit) {
|
||||||
|
joint.threeObject.limit.lower = originalLimits.lower;
|
||||||
|
joint.threeObject.limit.upper = originalLimits.upper;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else if (typeof joint.threeObject.setAngle === 'function') {
|
||||||
|
joint.threeObject.setAngle(angle);
|
||||||
|
|
||||||
|
// Restore original limits
|
||||||
|
if (originalLimits && joint.threeObject.limit) {
|
||||||
|
joint.threeObject.limit.lower = originalLimits.lower;
|
||||||
|
joint.threeObject.limit.upper = originalLimits.upper;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore original limits (if none of the above methods executed)
|
||||||
|
if (originalLimits && joint.threeObject.limit) {
|
||||||
|
joint.threeObject.limit.lower = originalLimits.lower;
|
||||||
|
joint.threeObject.limit.upper = originalLimits.upper;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If none available, manually set rotation
|
||||||
|
// Note: For URDF, we usually shouldn't reach here, as urdf-loader should provide setJointValue
|
||||||
|
console.warn(`Joint ${joint.name} has no setJointValue or setAngle method, attempting manual setup`);
|
||||||
|
if (joint.type === 'revolute' || joint.type === 'continuous') {
|
||||||
|
const axis = joint.axis ? new THREE.Vector3(...joint.axis.xyz).normalize() : new THREE.Vector3(0, 0, 1);
|
||||||
|
// Note: joint.threeObject may not be a Three.js object, cannot directly set rotation
|
||||||
|
if (joint.threeObject.rotation) {
|
||||||
|
joint.threeObject.rotation.setFromAxisAngle(axis, angle);
|
||||||
|
}
|
||||||
|
} else if (joint.type === 'prismatic') {
|
||||||
|
const axis = joint.axis ? new THREE.Vector3(...joint.axis.xyz).normalize() : new THREE.Vector3(1, 0, 0);
|
||||||
|
if (joint.threeObject.position) {
|
||||||
|
joint.threeObject.position.copy(axis.multiplyScalar(angle));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.warn(`Joint ${joint.name} has no threeObject`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
616
src/adapters/XacroAdapter.js
Normal file
@ -0,0 +1,616 @@
|
|||||||
|
/**
|
||||||
|
* Xacro Adapter
|
||||||
|
*
|
||||||
|
* Parses ROS Xacro files and converts them to URDF format using xacro-parser.
|
||||||
|
*
|
||||||
|
* Supported Features:
|
||||||
|
* - Property definitions and substitutions (xacro:property)
|
||||||
|
* - Macro definitions with parameters (xacro:macro)
|
||||||
|
* - Conditional blocks (xacro:if, xacro:unless)
|
||||||
|
* - File inclusions (xacro:include) with package:// and relative paths
|
||||||
|
* - Python-style boolean constants (True/False)
|
||||||
|
* - Arithmetic expressions and property evaluation
|
||||||
|
*
|
||||||
|
* Compatibility:
|
||||||
|
* - ROS Jade and later (inOrder=true, requirePrefix=true, localProperties=true)
|
||||||
|
* - Automatically injects True/False constants for compatibility with ROS xacro files
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* - Upload all related xacro files (main file and included files)
|
||||||
|
* - The adapter automatically resolves file inclusions from the uploaded file map
|
||||||
|
* - Mesh files are resolved using package:// paths or relative paths
|
||||||
|
*/
|
||||||
|
import { XacroParser } from 'xacro-parser';
|
||||||
|
import { URDFAdapter } from './URDFAdapter.js';
|
||||||
|
|
||||||
|
export class XacroAdapter {
|
||||||
|
/**
|
||||||
|
* Parse xacro content and convert to unified model
|
||||||
|
* @param {string} xacroContent - Xacro file content
|
||||||
|
* @param {string} fileName - Xacro file name (for working path)
|
||||||
|
* @param {Map} fileMap - File map (path -> File object)
|
||||||
|
* @param {File} file - Original file object (optional)
|
||||||
|
* @returns {Promise<UnifiedRobotModel>}
|
||||||
|
*/
|
||||||
|
static async parse(xacroContent, fileName, fileMap = null, file = null) {
|
||||||
|
try {
|
||||||
|
// Create xacro parser
|
||||||
|
const parser = new XacroParser();
|
||||||
|
|
||||||
|
// Configure parser for ROS Jade and later (default settings)
|
||||||
|
parser.inOrder = true;
|
||||||
|
parser.requirePrefix = true;
|
||||||
|
parser.localProperties = true;
|
||||||
|
|
||||||
|
// Set working path (directory where xacro file is located)
|
||||||
|
const workingPath = fileName.includes('/')
|
||||||
|
? fileName.substring(0, fileName.lastIndexOf('/') + 1)
|
||||||
|
: '';
|
||||||
|
parser.workingPath = workingPath;
|
||||||
|
|
||||||
|
// Inject Python-style boolean constants as xacro properties
|
||||||
|
// Some xacro files use True/False (capitalized) in conditions
|
||||||
|
xacroContent = this.injectBooleanConstants(xacroContent);
|
||||||
|
|
||||||
|
// Extract and set xacro arguments with their default values
|
||||||
|
// Also add common ROS arguments that might be used without definition
|
||||||
|
const xacroArgs = this.extractXacroArguments(xacroContent);
|
||||||
|
|
||||||
|
// Add common ROS arguments with sensible defaults if not already defined
|
||||||
|
if (!xacroArgs.hasOwnProperty('DEBUG')) {
|
||||||
|
xacroArgs.DEBUG = 'false';
|
||||||
|
}
|
||||||
|
if (!xacroArgs.hasOwnProperty('SELF_COLLIDE')) {
|
||||||
|
xacroArgs.SELF_COLLIDE = 'false';
|
||||||
|
}
|
||||||
|
|
||||||
|
parser.arguments = xacroArgs;
|
||||||
|
|
||||||
|
// If fileMap provided, setup custom file loader
|
||||||
|
if (fileMap) {
|
||||||
|
parser.getFileContents = async (path) => {
|
||||||
|
return await this.loadFileFromMap(path, fileMap, workingPath);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse xacro to URDF XML
|
||||||
|
const urdfXML = await parser.parse(xacroContent);
|
||||||
|
|
||||||
|
|
||||||
|
// Convert XMLDocument to string
|
||||||
|
const serializer = new XMLSerializer();
|
||||||
|
let urdfString = serializer.serializeToString(urdfXML);
|
||||||
|
|
||||||
|
// Clean up the XML string - remove empty xmlns attributes that might cause issues
|
||||||
|
urdfString = urdfString.replace(/\sxmlns=""/g, '');
|
||||||
|
|
||||||
|
// Re-parse the URDF string with DOMParser to create a clean XMLDocument
|
||||||
|
// This removes any xacro-specific nodes that urdf-loader might not handle
|
||||||
|
const domParser = new DOMParser();
|
||||||
|
const cleanUrdfXML = domParser.parseFromString(urdfString, 'text/xml');
|
||||||
|
|
||||||
|
// Check for parsing errors
|
||||||
|
const parseError = cleanUrdfXML.querySelector('parsererror');
|
||||||
|
if (parseError) {
|
||||||
|
throw new Error('Generated URDF has invalid XML: ' + parseError.textContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove problematic elements that urdf-loader might not handle well
|
||||||
|
// Remove gazebo elements (plugins, sensors, etc.)
|
||||||
|
const gazeboElements = cleanUrdfXML.querySelectorAll('gazebo');
|
||||||
|
gazeboElements.forEach(el => el.parentNode?.removeChild(el));
|
||||||
|
|
||||||
|
// Remove transmission elements (these are for Gazebo/ROS control)
|
||||||
|
const transmissionElements = cleanUrdfXML.querySelectorAll('transmission');
|
||||||
|
transmissionElements.forEach(el => el.parentNode?.removeChild(el));
|
||||||
|
|
||||||
|
// Remove visual/collision elements with empty geometry tags
|
||||||
|
this.removeEmptyGeometry(cleanUrdfXML);
|
||||||
|
|
||||||
|
// Clean up empty text nodes and comments that might cause issues
|
||||||
|
this.cleanXMLNodes(cleanUrdfXML.documentElement);
|
||||||
|
|
||||||
|
// Convert the clean XMLDocument back to string for URDFLoader
|
||||||
|
const finalUrdfString = serializer.serializeToString(cleanUrdfXML);
|
||||||
|
|
||||||
|
// Now use existing URDF loading infrastructure
|
||||||
|
// Import URDFLoader dynamically
|
||||||
|
const urdfModule = await import('urdf-loader');
|
||||||
|
const URDFLoader = urdfModule.URDFLoader || urdfModule.default || urdfModule;
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const loader = new URDFLoader();
|
||||||
|
loader.parseCollision = true;
|
||||||
|
|
||||||
|
// Extract directory where URDF file is located
|
||||||
|
const urdfDir = workingPath;
|
||||||
|
|
||||||
|
// If file map provided, setup resource loader (same as URDF loading)
|
||||||
|
if (fileMap) {
|
||||||
|
// Parse URDF content, find all used package names
|
||||||
|
const packages = this.extractPackagesFromURDF(finalUrdfString);
|
||||||
|
|
||||||
|
// Build package map
|
||||||
|
const packageMap = {};
|
||||||
|
packages.forEach(pkg => {
|
||||||
|
packageMap[pkg] = pkg;
|
||||||
|
});
|
||||||
|
packageMap[''] = '';
|
||||||
|
|
||||||
|
loader.packages = packageMap;
|
||||||
|
|
||||||
|
// Set URL Modifier (same as URDF loading)
|
||||||
|
const urlModifier = (url) => {
|
||||||
|
// Handle blob URLs
|
||||||
|
if (url.startsWith('blob:')) {
|
||||||
|
const blobMatch = url.match(/^blob:https?:\/\/[^\/]+\/(.+)$/);
|
||||||
|
if (blobMatch && blobMatch[1]) {
|
||||||
|
const fileName = blobMatch[1];
|
||||||
|
if (/\.(jpg|jpeg|png|gif|bmp|tga|tiff|webp|dae|stl|obj|gltf|glb)$/i.test(fileName)) {
|
||||||
|
url = fileName;
|
||||||
|
} else {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const isTextureFile = /\.(jpg|jpeg|png|gif|bmp|tga|tiff|webp)$/i.test(url);
|
||||||
|
const isMeshFile = /\.(dae|stl|obj|gltf|glb)$/i.test(url);
|
||||||
|
|
||||||
|
let meshPath = url;
|
||||||
|
|
||||||
|
// Remove http:// or https:// prefix
|
||||||
|
if (meshPath.startsWith('http://') || meshPath.startsWith('https://')) {
|
||||||
|
try {
|
||||||
|
const urlObj = new URL(meshPath);
|
||||||
|
meshPath = urlObj.pathname;
|
||||||
|
if (meshPath.startsWith('/')) {
|
||||||
|
meshPath = meshPath.substring(1);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// Invalid URL, use as-is
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove package:// prefix
|
||||||
|
if (meshPath.startsWith('package://')) {
|
||||||
|
meshPath = meshPath.replace(/^package:\/\//, '');
|
||||||
|
const parts = meshPath.split('/');
|
||||||
|
if (parts.length > 1) {
|
||||||
|
meshPath = parts.slice(1).join('/');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove leading ./
|
||||||
|
meshPath = meshPath.replace(/^\.\//, '');
|
||||||
|
|
||||||
|
// Handle relative paths
|
||||||
|
let normalizedPath = meshPath;
|
||||||
|
if (meshPath.includes('../')) {
|
||||||
|
const parts = meshPath.split('/');
|
||||||
|
const resolvedParts = [];
|
||||||
|
for (const part of parts) {
|
||||||
|
if (part === '..') {
|
||||||
|
resolvedParts.pop();
|
||||||
|
} else if (part !== '.' && part !== '') {
|
||||||
|
resolvedParts.push(part);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
normalizedPath = resolvedParts.join('/');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build full path
|
||||||
|
const fullPath = urdfDir + normalizedPath;
|
||||||
|
const altPath = urdfDir + meshPath;
|
||||||
|
|
||||||
|
// Find file in fileMap
|
||||||
|
let matchedFile = fileMap.get(fullPath);
|
||||||
|
|
||||||
|
if (!matchedFile && altPath !== fullPath) {
|
||||||
|
matchedFile = fileMap.get(altPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!matchedFile) {
|
||||||
|
matchedFile = fileMap.get(normalizedPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!matchedFile) {
|
||||||
|
matchedFile = fileMap.get(meshPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!matchedFile) {
|
||||||
|
const targetFileName = normalizedPath.split('/').pop() || meshPath.split('/').pop();
|
||||||
|
for (const [key, file] of fileMap.entries()) {
|
||||||
|
const keyFileName = key.split('/').pop();
|
||||||
|
if (keyFileName === targetFileName) {
|
||||||
|
matchedFile = file;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchedFile) {
|
||||||
|
const bloburl = URL.createObjectURL(matchedFile);
|
||||||
|
return bloburl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return url;
|
||||||
|
};
|
||||||
|
|
||||||
|
loader.manager.setURLModifier(urlModifier);
|
||||||
|
|
||||||
|
// Custom loadMeshCb (same as URDF loading)
|
||||||
|
const originalLoadMeshCb = loader.loadMeshCb || loader.defaultMeshLoader.bind(loader);
|
||||||
|
loader.loadMeshCb = (path, manager, done) => {
|
||||||
|
this.findFileInMapByPath(path, fileMap, urdfDir).then(file => {
|
||||||
|
if (file) {
|
||||||
|
const ext = (file.name || path).toLowerCase().split('.').pop();
|
||||||
|
this.loadMeshFileAsync(file, ext, manager).then(meshObject => {
|
||||||
|
if (meshObject) {
|
||||||
|
done(meshObject, null);
|
||||||
|
} else {
|
||||||
|
done(null, new Error(`Failed to load mesh file: ${path}`));
|
||||||
|
}
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(`Failed to load mesh: ${path}`, err);
|
||||||
|
done(null, err);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
let stlPath = path
|
||||||
|
stlPath = stlPath.replace('file:///', 'inspection/elfin10')
|
||||||
|
originalLoadMeshCb(path, manager, done);
|
||||||
|
}
|
||||||
|
}).catch(error => {
|
||||||
|
console.error(`Failed to find file: ${path}`, error);
|
||||||
|
originalLoadMeshCb(path, manager, done);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create temporary URL for URDF content
|
||||||
|
const blob = new Blob([finalUrdfString], { type: 'text/xml' });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
|
||||||
|
loader.load(url, (robot) => {
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
|
||||||
|
// Convert to unified model using URDFAdapter
|
||||||
|
try {
|
||||||
|
const model = URDFAdapter.convert(robot, finalUrdfString);
|
||||||
|
resolve(model);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[XacroAdapter] URDF conversion error:', error);
|
||||||
|
reject(new Error('URDF conversion failed: ' + error.message));
|
||||||
|
}
|
||||||
|
}, undefined, (error) => {
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
console.error('[XacroAdapter] URDF loading error:', error);
|
||||||
|
reject(new Error('URDF loading failed: ' + (error.message || error)));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[XacroAdapter] Xacro parsing error:', error);
|
||||||
|
throw new Error('Xacro parsing failed: ' + error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load file from fileMap for xacro includes
|
||||||
|
* @param {string} path - File path
|
||||||
|
* @param {Map} fileMap - File map
|
||||||
|
* @param {string} workingPath - Working directory
|
||||||
|
* @returns {Promise<string>}
|
||||||
|
*/
|
||||||
|
static async loadFileFromMap(path, fileMap, workingPath) {
|
||||||
|
// Clean path - remove leading slash if present
|
||||||
|
let cleanPath = path;
|
||||||
|
// if (cleanPath.startsWith('/')) {
|
||||||
|
// cleanPath = cleanPath.substring(1);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Remove leading ./
|
||||||
|
// cleanPath = cleanPath.replace(/^\.\//, '');
|
||||||
|
cleanPath = cleanPath.split('///')[1];
|
||||||
|
// Try different path combinations
|
||||||
|
const possiblePaths = [
|
||||||
|
cleanPath,
|
||||||
|
workingPath + cleanPath,
|
||||||
|
path,
|
||||||
|
workingPath + path.replace(/^\/+/, ''),
|
||||||
|
// Also try without the first directory component
|
||||||
|
cleanPath.includes('/') ? cleanPath.substring(cleanPath.indexOf('/') + 1) : cleanPath,
|
||||||
|
];
|
||||||
|
|
||||||
|
// Try each path
|
||||||
|
for (const tryPath of possiblePaths) {
|
||||||
|
const file = fileMap.get(tryPath);
|
||||||
|
if (file) {
|
||||||
|
const content = await file.text();
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try filename only match
|
||||||
|
const fileName = cleanPath.split('/').pop();
|
||||||
|
for (const [key, file] of fileMap.entries()) {
|
||||||
|
const keyFileName = key.split('/').pop();
|
||||||
|
if (keyFileName === fileName) {
|
||||||
|
const content = await file.text();
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.error('[XacroAdapter] Cannot find included file:', path);
|
||||||
|
throw new Error(`Cannot find included file: ${path}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove visual/collision elements with empty geometry tags
|
||||||
|
* xacro-parser may not fully expand conditional geometry (xacro:if)
|
||||||
|
* We'll just remove these empty visual elements rather than try to fix them
|
||||||
|
* @param {XMLDocument} xmlDoc - XML document to clean
|
||||||
|
*/
|
||||||
|
static removeEmptyGeometry(xmlDoc) {
|
||||||
|
// Find all geometry elements
|
||||||
|
const geometryElements = xmlDoc.querySelectorAll('geometry');
|
||||||
|
|
||||||
|
geometryElements.forEach(geom => {
|
||||||
|
// Check if geometry is empty (no child elements)
|
||||||
|
if (!geom.children || geom.children.length === 0) {
|
||||||
|
// Find the parent visual or collision element
|
||||||
|
let parent = geom.parentNode;
|
||||||
|
if (parent) {
|
||||||
|
const grandParent = parent.parentNode;
|
||||||
|
if (grandParent) {
|
||||||
|
if (parent.nodeName === 'visual' || parent.nodeName === 'collision') {
|
||||||
|
// Remove empty visual/collision elements
|
||||||
|
grandParent.removeChild(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively clean XML nodes - remove empty text nodes and comments
|
||||||
|
* @param {Element} element - Element to clean
|
||||||
|
*/
|
||||||
|
static cleanXMLNodes(element) {
|
||||||
|
if (!element || !element.childNodes) return;
|
||||||
|
|
||||||
|
const nodesToRemove = [];
|
||||||
|
|
||||||
|
// Collect nodes to remove
|
||||||
|
for (let i = 0; i < element.childNodes.length; i++) {
|
||||||
|
const node = element.childNodes[i];
|
||||||
|
|
||||||
|
// Remove comments
|
||||||
|
if (node.nodeType === Node.COMMENT_NODE) {
|
||||||
|
nodesToRemove.push(node);
|
||||||
|
}
|
||||||
|
// Remove empty or whitespace-only text nodes
|
||||||
|
else if (node.nodeType === Node.TEXT_NODE) {
|
||||||
|
if (!node.nodeValue || node.nodeValue.trim() === '') {
|
||||||
|
nodesToRemove.push(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Recursively clean element nodes
|
||||||
|
else if (node.nodeType === Node.ELEMENT_NODE) {
|
||||||
|
this.cleanXMLNodes(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove collected nodes
|
||||||
|
nodesToRemove.forEach(node => {
|
||||||
|
element.removeChild(node);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract package names from URDF content
|
||||||
|
* @param {string} urdfContent - URDF content
|
||||||
|
* @returns {Set<string>}
|
||||||
|
*/
|
||||||
|
static extractPackagesFromURDF(urdfContent) {
|
||||||
|
const packages = new Set();
|
||||||
|
const packageRegex = /package:\/\/([^\/]+)/g;
|
||||||
|
let match;
|
||||||
|
while ((match = packageRegex.exec(urdfContent)) !== null) {
|
||||||
|
packages.add(match[1]);
|
||||||
|
}
|
||||||
|
return packages;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find file in fileMap by path
|
||||||
|
* @param {string} path - File path
|
||||||
|
* @param {Map} fileMap - File map
|
||||||
|
* @param {string} urdfDir - URDF directory
|
||||||
|
* @returns {Promise<File|null>}
|
||||||
|
*/
|
||||||
|
static async findFileInMapByPath(path, fileMap, urdfDir) {
|
||||||
|
let meshPath = path;
|
||||||
|
|
||||||
|
// Remove blob: prefix
|
||||||
|
meshPath = meshPath.replace(/^blob:[^\/]+\//, '');
|
||||||
|
|
||||||
|
// Remove package:// prefix
|
||||||
|
if (meshPath.startsWith('package://')) {
|
||||||
|
meshPath = meshPath.replace(/^package:\/\//, '');
|
||||||
|
const parts = meshPath.split('/');
|
||||||
|
if (parts.length > 1) {
|
||||||
|
meshPath = parts.slice(1).join('/');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove leading ./
|
||||||
|
meshPath = meshPath.replace(/^\.\//, '');
|
||||||
|
|
||||||
|
// Build full path
|
||||||
|
const fullPath = urdfDir + meshPath;
|
||||||
|
|
||||||
|
// Try full path
|
||||||
|
let file = fileMap.get(fullPath);
|
||||||
|
if (file) return file;
|
||||||
|
|
||||||
|
// Try path without directory
|
||||||
|
file = fileMap.get(meshPath);
|
||||||
|
if (file) return file;
|
||||||
|
|
||||||
|
// Try filename match
|
||||||
|
const targetFileName = meshPath.split('/').pop();
|
||||||
|
for (const [key, f] of fileMap.entries()) {
|
||||||
|
const keyFileName = key.split('/').pop();
|
||||||
|
if (keyFileName === targetFileName) {
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load mesh file asynchronously
|
||||||
|
* @param {File} file - File object
|
||||||
|
* @param {string} ext - File extension
|
||||||
|
* @param {THREE.LoadingManager} manager - Loading manager
|
||||||
|
* @returns {Promise<THREE.Object3D>}
|
||||||
|
*/
|
||||||
|
static async loadMeshFileAsync(file, ext, manager) {
|
||||||
|
const THREE = await import('three');
|
||||||
|
const blobUrl = URL.createObjectURL(file);
|
||||||
|
|
||||||
|
try {
|
||||||
|
let meshObject = null;
|
||||||
|
|
||||||
|
switch (ext) {
|
||||||
|
case 'stl': {
|
||||||
|
const { STLLoader } = await import('three/examples/jsm/loaders/STLLoader.js');
|
||||||
|
const stlLoader = new STLLoader(manager);
|
||||||
|
const stlGeometry = await new Promise((resolve, reject) => {
|
||||||
|
stlLoader.load(blobUrl, resolve, undefined, reject);
|
||||||
|
});
|
||||||
|
const stlMaterial = new THREE.MeshPhongMaterial();
|
||||||
|
meshObject = new THREE.Mesh(stlGeometry, stlMaterial);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dae': {
|
||||||
|
const { ColladaLoader } = await import('three/examples/jsm/loaders/ColladaLoader.js');
|
||||||
|
const colladaLoader = new ColladaLoader(manager);
|
||||||
|
const colladaModel = await new Promise((resolve, reject) => {
|
||||||
|
colladaLoader.load(blobUrl, resolve, undefined, reject);
|
||||||
|
});
|
||||||
|
meshObject = colladaModel.scene;
|
||||||
|
|
||||||
|
// Remove lights
|
||||||
|
if (meshObject && meshObject.traverse) {
|
||||||
|
const lightsToRemove = [];
|
||||||
|
meshObject.traverse(child => {
|
||||||
|
if (child.isLight) {
|
||||||
|
lightsToRemove.push(child);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
lightsToRemove.forEach(light => {
|
||||||
|
if (light.parent) {
|
||||||
|
light.parent.remove(light);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'obj': {
|
||||||
|
const { OBJLoader } = await import('three/examples/jsm/loaders/OBJLoader.js');
|
||||||
|
const objLoader = new OBJLoader(manager);
|
||||||
|
meshObject = await new Promise((resolve, reject) => {
|
||||||
|
objLoader.load(blobUrl, resolve, undefined, reject);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'gltf':
|
||||||
|
case 'glb': {
|
||||||
|
const { GLTFLoader } = await import('three/examples/jsm/loaders/GLTFLoader.js');
|
||||||
|
const gltfLoader = new GLTFLoader(manager);
|
||||||
|
const gltfModel = await new Promise((resolve, reject) => {
|
||||||
|
gltfLoader.load(blobUrl, resolve, undefined, reject);
|
||||||
|
});
|
||||||
|
meshObject = gltfModel.scene;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
console.warn(`Unsupported file format: ${ext}`);
|
||||||
|
URL.revokeObjectURL(blobUrl);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
URL.revokeObjectURL(blobUrl);
|
||||||
|
return meshObject;
|
||||||
|
} catch (error) {
|
||||||
|
URL.revokeObjectURL(blobUrl);
|
||||||
|
console.error(`Failed to load mesh file: ${file.name}`, error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject Python-style boolean constants (True/False) into xacro content
|
||||||
|
* Some xacro files use capitalized True/False in conditional expressions
|
||||||
|
* The parameters are passed as strings ("True", "False") but compared to constants
|
||||||
|
* We define the constants to match the string values for comparison to work
|
||||||
|
* @param {string} xacroContent - Original xacro content
|
||||||
|
* @returns {string} - Modified xacro content with boolean constants defined
|
||||||
|
*/
|
||||||
|
static injectBooleanConstants(xacroContent) {
|
||||||
|
// Find the robot tag opening
|
||||||
|
const robotTagMatch = xacroContent.match(/(<robot[^>]*>)/);
|
||||||
|
if (!robotTagMatch) {
|
||||||
|
return xacroContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define True/False as string properties for comparison
|
||||||
|
// When mirror_dae="True" is passed, it becomes the string "True"
|
||||||
|
// We want ${mirror_dae == True} to work, so True must also be "True"
|
||||||
|
const booleanProperties = `
|
||||||
|
<!-- Injected by XacroAdapter: Python-style boolean constants -->
|
||||||
|
<xacro:property name="True" value="True"/>
|
||||||
|
<xacro:property name="False" value="False"/>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const insertPosition = robotTagMatch.index + robotTagMatch[0].length;
|
||||||
|
return xacroContent.substring(0, insertPosition) +
|
||||||
|
booleanProperties +
|
||||||
|
xacroContent.substring(insertPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract xacro arguments and their default values from xacro content
|
||||||
|
* Xacro files can define arguments using <xacro:arg name="..." default="..."/>
|
||||||
|
* These need to be provided to the parser via parser.arguments
|
||||||
|
* @param {string} xacroContent - Xacro file content
|
||||||
|
* @returns {Object} - Object with argument names as keys and default values
|
||||||
|
*/
|
||||||
|
static extractXacroArguments(xacroContent) {
|
||||||
|
const args = {};
|
||||||
|
|
||||||
|
// Match <xacro:arg name="NAME" default="VALUE"/>
|
||||||
|
// Also match <arg name="NAME" default="VALUE"/> (without xacro: prefix)
|
||||||
|
const argPattern = /<(?:xacro:)?arg\s+name=["']([^"']+)["'](?:\s+default=["']([^"']*)["'])?/g;
|
||||||
|
|
||||||
|
let match;
|
||||||
|
while ((match = argPattern.exec(xacroContent)) !== null) {
|
||||||
|
const argName = match[1];
|
||||||
|
const defaultValue = match[2] || 'false'; // Default to 'false' if no default specified
|
||||||
|
args[argName] = defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
31
src/api/device/system.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function getSafetyState(robotId) {
|
||||||
|
return request({
|
||||||
|
url: '/api/system/safetyState',
|
||||||
|
method: 'get',
|
||||||
|
params: { robotId },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 恢复机器人运行状态;payload 与旧 recoverSafetyState 保持一致,便于调用方渐进迁移。
|
||||||
|
*/
|
||||||
|
export function restoreOperationalState(data) {
|
||||||
|
return request({
|
||||||
|
url: '/api/system/restoreOperationalState',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated 请改用 restoreOperationalState,旧接口仅保留给未迁移调用方。
|
||||||
|
*/
|
||||||
|
export function recoverSafetyState(data) {
|
||||||
|
return request({
|
||||||
|
url: '/api/system/recoverSafetyState',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
123
src/api/flow/flow.js
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 发布流程
|
||||||
|
export function flowDeploy(data) {
|
||||||
|
return request({
|
||||||
|
url: '/flow/publish',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowSaveDraft(data) {
|
||||||
|
return request({ url: '/flow/draft', method: 'put', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowVersionList(itemId) {
|
||||||
|
return request({ url: `/flow/versions/${itemId}`, method: 'get' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowVersionDetail(versionId) {
|
||||||
|
return request({ url: `/flow/version/${versionId}`, method: 'get' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowSubFlowOptions(currentItemId) {
|
||||||
|
return request({
|
||||||
|
url: '/flow/subflows',
|
||||||
|
method: 'get',
|
||||||
|
params: { currentItemId }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowRestoreDraft(versionId, data) {
|
||||||
|
return request({ url: `/flow/version/${versionId}/restore-draft`, method: 'post', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowRollbackVersion(versionId, data) {
|
||||||
|
return request({ url: `/flow/version/${versionId}/rollback`, method: 'post', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowExecute(data) {
|
||||||
|
return request({
|
||||||
|
url: '/flow/execute',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowAction(data) {
|
||||||
|
return request({
|
||||||
|
url: '/flow/action',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowExecuteTrial(data) {
|
||||||
|
return request({
|
||||||
|
url: '/flow/executeTrial',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowView(data) {
|
||||||
|
return request({
|
||||||
|
url: '/flow/view',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowPause(instId) {
|
||||||
|
return request({
|
||||||
|
url: `/flow/pause/${instId}`,
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowResume(instId) {
|
||||||
|
return request({
|
||||||
|
url: `/flow/resume/${instId}`,
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function flowStop(instId) {
|
||||||
|
return request({
|
||||||
|
url: `/flow/stop/${instId}`,
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getArmStatus(params) {
|
||||||
|
return request({
|
||||||
|
url: '/api/arm/getPose',
|
||||||
|
method: 'get',
|
||||||
|
params: params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAgvStatus(params) {
|
||||||
|
return request({
|
||||||
|
url: '/api/agv/getRuntimeState',
|
||||||
|
method: 'get',
|
||||||
|
params: params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAgvStations(params) {
|
||||||
|
return request({
|
||||||
|
url: '/api/agv/listStations',
|
||||||
|
method: 'get',
|
||||||
|
params: params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getArmJointState(params) {
|
||||||
|
return request({
|
||||||
|
url: '/api/arm/getJointState',
|
||||||
|
method: 'get',
|
||||||
|
params: params
|
||||||
|
})
|
||||||
|
}
|
||||||
5
src/api/flow/nodeRed.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function getNodeRedFlowById(id) {
|
||||||
|
return request.get(`${import.meta.env.VITE_NODE_RED_URL}/flow/${id}`, {})
|
||||||
|
}
|
||||||
69
src/api/login.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 登录方法
|
||||||
|
export function login(username, password, code, uuid) {
|
||||||
|
const data = {
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
code,
|
||||||
|
uuid
|
||||||
|
}
|
||||||
|
return request({
|
||||||
|
url: '/login',
|
||||||
|
headers: {
|
||||||
|
isToken: false,
|
||||||
|
repeatSubmit: false
|
||||||
|
},
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注册方法
|
||||||
|
export function register(data) {
|
||||||
|
return request({
|
||||||
|
url: '/register',
|
||||||
|
headers: {
|
||||||
|
isToken: false
|
||||||
|
},
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取用户详细信息
|
||||||
|
export function getInfo() {
|
||||||
|
return request({
|
||||||
|
url: '/getInfo',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解锁屏幕
|
||||||
|
export function unlockScreen(password) {
|
||||||
|
return request({
|
||||||
|
url: '/unlockscreen',
|
||||||
|
method: 'post',
|
||||||
|
data: { password }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 退出方法
|
||||||
|
export function logout() {
|
||||||
|
return request({
|
||||||
|
url: '/logout',
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取验证码
|
||||||
|
export function getCodeImg() {
|
||||||
|
return request({
|
||||||
|
url: '/captchaImage',
|
||||||
|
headers: {
|
||||||
|
isToken: false
|
||||||
|
},
|
||||||
|
method: 'get',
|
||||||
|
timeout: 20000
|
||||||
|
})
|
||||||
|
}
|
||||||
9
src/api/menu.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 获取路由
|
||||||
|
export const getRouters = () => {
|
||||||
|
return request({
|
||||||
|
url: '/getRouters',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
57
src/api/monitor/cache.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询缓存详细
|
||||||
|
export function getCache() {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/cache',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询缓存名称列表
|
||||||
|
export function listCacheName() {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/cache/getNames',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询缓存键名列表
|
||||||
|
export function listCacheKey(cacheName) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/cache/getKeys/' + cacheName,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询缓存内容
|
||||||
|
export function getCacheValue(cacheName, cacheKey) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清理指定名称缓存
|
||||||
|
export function clearCacheName(cacheName) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/cache/clearCacheName/' + cacheName,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清理指定键名缓存
|
||||||
|
export function clearCacheKey(cacheKey) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/cache/clearCacheKey/' + cacheKey,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清理全部缓存
|
||||||
|
export function clearCacheAll() {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/cache/clearCacheAll',
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
71
src/api/monitor/job.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询定时任务调度列表
|
||||||
|
export function listJob(query) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/job/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询定时任务调度详细
|
||||||
|
export function getJob(jobId) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/job/' + jobId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增定时任务调度
|
||||||
|
export function addJob(data) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/job',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改定时任务调度
|
||||||
|
export function updateJob(data) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/job',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除定时任务调度
|
||||||
|
export function delJob(jobId) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/job/' + jobId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 任务状态修改
|
||||||
|
export function changeJobStatus(jobId, status) {
|
||||||
|
const data = {
|
||||||
|
jobId,
|
||||||
|
status
|
||||||
|
}
|
||||||
|
return request({
|
||||||
|
url: '/monitor/job/changeStatus',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 定时任务立即执行一次
|
||||||
|
export function runJob(jobId, jobGroup) {
|
||||||
|
const data = {
|
||||||
|
jobId,
|
||||||
|
jobGroup
|
||||||
|
}
|
||||||
|
return request({
|
||||||
|
url: '/monitor/job/run',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
26
src/api/monitor/jobLog.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询调度日志列表
|
||||||
|
export function listJobLog(query) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/jobLog/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除调度日志
|
||||||
|
export function delJobLog(jobLogId) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/jobLog/' + jobLogId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清空调度日志
|
||||||
|
export function cleanJobLog() {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/jobLog/clean',
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
34
src/api/monitor/logininfor.js
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询登录日志列表
|
||||||
|
export function list(query) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/logininfor/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除登录日志
|
||||||
|
export function delLogininfor(infoId) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/logininfor/' + infoId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解锁用户登录状态
|
||||||
|
export function unlockLogininfor(userName) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/logininfor/unlock/' + userName,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清空登录日志
|
||||||
|
export function cleanLogininfor() {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/logininfor/clean',
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
18
src/api/monitor/online.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询在线用户列表
|
||||||
|
export function list(query) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/online/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 强退用户
|
||||||
|
export function forceLogout(tokenId) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/online/' + tokenId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
26
src/api/monitor/operlog.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询操作日志列表
|
||||||
|
export function list(query) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/operlog/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除操作日志
|
||||||
|
export function delOperlog(operId) {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/operlog/' + operId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清空操作日志
|
||||||
|
export function cleanOperlog() {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/operlog/clean',
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
9
src/api/monitor/server.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 获取服务信息
|
||||||
|
export function getServer() {
|
||||||
|
return request({
|
||||||
|
url: '/monitor/server',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
13
src/api/resource/device.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function listResourceDevices(params) {
|
||||||
|
return request({ url: '/resource/devices', method: 'get', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getResourceDevice(id) {
|
||||||
|
return request({ url: `/resource/devices/${encodeURIComponent(id)}`, method: 'get' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateResourceDevice(id, data) {
|
||||||
|
return request({ url: `/resource/devices/${encodeURIComponent(id)}`, method: 'put', data })
|
||||||
|
}
|
||||||
24
src/api/resource/map.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function listResourceMaps(params) {
|
||||||
|
return request({ url: '/resource/maps', method: 'get', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function listRobotMaps(robotId) {
|
||||||
|
return request({
|
||||||
|
url: `/resource/maps/robot/${encodeURIComponent(robotId)}`,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addResourceMap(data) {
|
||||||
|
return request({ url: '/resource/maps', method: 'post', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateResourceMap(data) {
|
||||||
|
return request({ url: '/resource/maps', method: 'put', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deleteResourceMap(ids) {
|
||||||
|
return request({ url: `/resource/maps/${ids}`, method: 'delete' })
|
||||||
|
}
|
||||||
77
src/api/resource/robot.js
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function listResourceRobots(params) {
|
||||||
|
return request({ url: '/resource/robots', method: 'get', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getResourceRobot(robotId) {
|
||||||
|
return request({ url: `/resource/robots/${encodeURIComponent(robotId)}`, method: 'get' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function listRobotDevices(robotId, params = {}) {
|
||||||
|
return request({
|
||||||
|
url: `/resource/robots/${encodeURIComponent(robotId)}/devices`,
|
||||||
|
method: 'get',
|
||||||
|
params,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getRobotList = listResourceRobots
|
||||||
|
|
||||||
|
export function addRobot(data) {
|
||||||
|
return request({ url: '/resource/robots', method: 'post', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateRobot(data) {
|
||||||
|
return request({ url: '/resource/robots', method: 'put', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deleteRobot(id) {
|
||||||
|
return request({ url: `/resource/robots/${id}`, method: 'delete' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRobotDevices(id) {
|
||||||
|
return request({ url: `/resource/robots/id/${id}/devices`, method: 'get' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRobotDevicesByRobotId(robotId, params = {}) {
|
||||||
|
return request({
|
||||||
|
url: `/resource/robots/${encodeURIComponent(robotId)}/devices`,
|
||||||
|
method: 'get',
|
||||||
|
params: { onlineOnly: true, ...params },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMapByRobot(robotRef) {
|
||||||
|
return request({
|
||||||
|
url: `/resource/robots/${encodeURIComponent(robotRef)}/remote-maps`,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getMapJson(params) {
|
||||||
|
return request({
|
||||||
|
url: `/resource/robots/${encodeURIComponent(params.robotId)}/download-map`,
|
||||||
|
method: 'get',
|
||||||
|
params,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRobotLocation(robotRef) {
|
||||||
|
return request({
|
||||||
|
url: `/resource/robots/${encodeURIComponent(robotRef)}/location`,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRobotStatus(id) {
|
||||||
|
return request({ url: `/resource/robots/id/${id}`, method: 'get' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function moveRobot(data) {
|
||||||
|
return request({ url: '/api/agv/setVelocity', method: 'post', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function stopRobot(data) {
|
||||||
|
return request({ url: '/api/agv/stopVelocityControl', method: 'post', data })
|
||||||
|
}
|
||||||
29
src/api/resource/terminal.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function listResourceTerminals(params) {
|
||||||
|
return request({ url: '/resource/terminals', method: 'get', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addResourceTerminal(data) {
|
||||||
|
return request({ url: '/resource/terminals', method: 'post', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateResourceTerminal(data) {
|
||||||
|
return request({ url: '/resource/terminals', method: 'put', data })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getResourceTerminal(id) {
|
||||||
|
return request({ url: `/resource/terminals/${encodeURIComponent(id)}`, method: 'get' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deleteResourceTerminals(ids) {
|
||||||
|
return request({ url: `/resource/terminals/${ids}`, method: 'delete' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function listTerminalRobots(id) {
|
||||||
|
return request({ url: `/resource/terminals/${encodeURIComponent(id)}/robots`, method: 'get' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateTerminalRobots(id, robotIds) {
|
||||||
|
return request({ url: `/resource/terminals/${encodeURIComponent(id)}/robots`, method: 'put', data: robotIds })
|
||||||
|
}
|
||||||
60
src/api/system/config.js
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询参数列表
|
||||||
|
export function listConfig(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/config/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询参数详细
|
||||||
|
export function getConfig(configId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/config/' + configId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据参数键名查询参数值
|
||||||
|
export function getConfigKey(configKey) {
|
||||||
|
return request({
|
||||||
|
url: '/system/config/configKey/' + configKey,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增参数配置
|
||||||
|
export function addConfig(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/config',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改参数配置
|
||||||
|
export function updateConfig(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/config',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除参数配置
|
||||||
|
export function delConfig(configId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/config/' + configId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 刷新参数缓存
|
||||||
|
export function refreshCache() {
|
||||||
|
return request({
|
||||||
|
url: '/system/config/refreshCache',
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
61
src/api/system/dept.js
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询部门列表
|
||||||
|
export function listDept(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dept/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询部门列表(排除节点)
|
||||||
|
export function listDeptExcludeChild(deptId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dept/list/exclude/' + deptId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询部门详细
|
||||||
|
export function getDept(deptId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dept/' + deptId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增部门
|
||||||
|
export function addDept(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dept',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改部门
|
||||||
|
export function updateDept(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dept',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存部门排序
|
||||||
|
export function updateDeptSort(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dept/updateSort',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除部门
|
||||||
|
export function delDept(deptId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dept/' + deptId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
52
src/api/system/dict/data.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询字典数据列表
|
||||||
|
export function listData(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/data/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询字典数据详细
|
||||||
|
export function getData(dictCode) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/data/' + dictCode,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据字典类型查询字典数据信息
|
||||||
|
export function getDicts(dictType) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/data/type/' + dictType,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增字典数据
|
||||||
|
export function addData(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/data',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改字典数据
|
||||||
|
export function updateData(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/data',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除字典数据
|
||||||
|
export function delData(dictCode) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/data/' + dictCode,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
60
src/api/system/dict/type.js
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询字典类型列表
|
||||||
|
export function listType(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/type/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询字典类型详细
|
||||||
|
export function getType(dictId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/type/' + dictId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增字典类型
|
||||||
|
export function addType(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/type',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改字典类型
|
||||||
|
export function updateType(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/type',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除字典类型
|
||||||
|
export function delType(dictId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/type/' + dictId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 刷新字典缓存
|
||||||
|
export function refreshCache() {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/type/refreshCache',
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取字典选择框列表
|
||||||
|
export function optionselect() {
|
||||||
|
return request({
|
||||||
|
url: '/system/dict/type/optionselect',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
44
src/api/system/file.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询文件管理列表
|
||||||
|
export function listFile(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/file/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询文件管理详细
|
||||||
|
export function getFile(fileId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/file/' + fileId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增文件管理
|
||||||
|
export function addFile(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/file',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改文件管理
|
||||||
|
export function updateFile(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/file',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除文件管理
|
||||||
|
export function delFile(fileId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/file/' + fileId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
44
src/api/system/group.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询通用分组配置列表
|
||||||
|
export function listGroup(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/group/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询通用分组配置详细
|
||||||
|
export function getGroup(groupId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/group/' + groupId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增通用分组配置
|
||||||
|
export function addGroup(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/group',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改通用分组配置
|
||||||
|
export function updateGroup(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/group',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除通用分组配置
|
||||||
|
export function delGroup(groupId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/group/' + groupId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
69
src/api/system/menu.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询菜单列表
|
||||||
|
export function listMenu(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/menu/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询菜单详细
|
||||||
|
export function getMenu(menuId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/menu/' + menuId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询菜单下拉树结构
|
||||||
|
export function treeselect() {
|
||||||
|
return request({
|
||||||
|
url: '/system/menu/treeselect',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据角色ID查询菜单下拉树结构
|
||||||
|
export function roleMenuTreeselect(roleId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/menu/roleMenuTreeselect/' + roleId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增菜单
|
||||||
|
export function addMenu(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/menu',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改菜单
|
||||||
|
export function updateMenu(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/menu',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存菜单排序
|
||||||
|
export function updateMenuSort(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/menu/updateSort',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除菜单
|
||||||
|
export function delMenu(menuId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/menu/' + menuId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
79
src/api/system/notice.js
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询公告列表
|
||||||
|
export function listNotice(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询公告详细
|
||||||
|
export function getNotice(noticeId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice/' + noticeId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增公告
|
||||||
|
export function addNotice(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改公告
|
||||||
|
export function updateNotice(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除公告
|
||||||
|
export function delNotice(noticeId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice/' + noticeId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 首页顶部公告列表(带已读状态)
|
||||||
|
export function listNoticeTop() {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice/listTop',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标记公告已读
|
||||||
|
export function markNoticeRead(noticeId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice/markRead',
|
||||||
|
method: 'post',
|
||||||
|
params: { noticeId }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 批量标记已读
|
||||||
|
export function markNoticeReadAll(ids) {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice/markReadAll',
|
||||||
|
method: 'post',
|
||||||
|
params: { ids }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询公告已读用户列表
|
||||||
|
export function listNoticeReadUsers(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/notice/readUsers/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
44
src/api/system/post.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询岗位列表
|
||||||
|
export function listPost(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/post/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询岗位详细
|
||||||
|
export function getPost(postId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/post/' + postId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增岗位
|
||||||
|
export function addPost(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/post',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改岗位
|
||||||
|
export function updatePost(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/post',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除岗位
|
||||||
|
export function delPost(postId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/post/' + postId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
119
src/api/system/role.js
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询角色列表
|
||||||
|
export function listRole(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询角色详细
|
||||||
|
export function getRole(roleId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/' + roleId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增角色
|
||||||
|
export function addRole(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改角色
|
||||||
|
export function updateRole(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 角色数据权限
|
||||||
|
export function dataScope(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/dataScope',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 角色状态修改
|
||||||
|
export function changeRoleStatus(roleId, status) {
|
||||||
|
const data = {
|
||||||
|
roleId,
|
||||||
|
status
|
||||||
|
}
|
||||||
|
return request({
|
||||||
|
url: '/system/role/changeStatus',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除角色
|
||||||
|
export function delRole(roleId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/' + roleId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询角色已授权用户列表
|
||||||
|
export function allocatedUserList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/authUser/allocatedList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询角色未授权用户列表
|
||||||
|
export function unallocatedUserList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/authUser/unallocatedList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 取消用户授权角色
|
||||||
|
export function authUserCancel(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/authUser/cancel',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 批量取消用户授权角色
|
||||||
|
export function authUserCancelAll(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/authUser/cancelAll',
|
||||||
|
method: 'put',
|
||||||
|
params: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 授权用户选择
|
||||||
|
export function authUserSelectAll(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/authUser/selectAll',
|
||||||
|
method: 'put',
|
||||||
|
params: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据角色ID查询部门树结构
|
||||||
|
export function deptTreeSelect(roleId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/role/deptTree/' + roleId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
136
src/api/system/user.js
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
import { parseStrEmpty } from "@/utils/ruoyi";
|
||||||
|
|
||||||
|
// 查询用户列表
|
||||||
|
export function listUser(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询用户详细
|
||||||
|
export function getUser(userId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/' + parseStrEmpty(userId),
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增用户
|
||||||
|
export function addUser(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改用户
|
||||||
|
export function updateUser(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除用户
|
||||||
|
export function delUser(userId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/' + userId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户密码重置
|
||||||
|
export function resetUserPwd(userId, password) {
|
||||||
|
const data = {
|
||||||
|
userId,
|
||||||
|
password
|
||||||
|
}
|
||||||
|
return request({
|
||||||
|
url: '/system/user/resetPwd',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户状态修改
|
||||||
|
export function changeUserStatus(userId, status) {
|
||||||
|
const data = {
|
||||||
|
userId,
|
||||||
|
status
|
||||||
|
}
|
||||||
|
return request({
|
||||||
|
url: '/system/user/changeStatus',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询用户个人信息
|
||||||
|
export function getUserProfile() {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/profile',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改用户个人信息
|
||||||
|
export function updateUserProfile(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/profile',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户密码重置
|
||||||
|
export function updateUserPwd(oldPassword, newPassword) {
|
||||||
|
const data = {
|
||||||
|
oldPassword,
|
||||||
|
newPassword
|
||||||
|
}
|
||||||
|
return request({
|
||||||
|
url: '/system/user/profile/updatePwd',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户头像上传
|
||||||
|
export function uploadAvatar(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/profile/avatar',
|
||||||
|
method: 'post',
|
||||||
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询授权角色
|
||||||
|
export function getAuthRole(userId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/authRole/' + userId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存授权角色
|
||||||
|
export function updateAuthRole(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/authRole',
|
||||||
|
method: 'put',
|
||||||
|
params: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询部门下拉树结构
|
||||||
|
export function deptTreeSelect() {
|
||||||
|
return request({
|
||||||
|
url: '/system/user/deptTree',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
44
src/api/system/vehOper.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询车机操作配置列表
|
||||||
|
export function listVehOper(query) {
|
||||||
|
return request({
|
||||||
|
url: '/system/vehOper/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询车机操作配置详细
|
||||||
|
export function getVehOper(configId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/vehOper/' + configId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增车机操作配置
|
||||||
|
export function addVehOper(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/vehOper',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改车机操作配置
|
||||||
|
export function updateVehOper(data) {
|
||||||
|
return request({
|
||||||
|
url: '/system/vehOper',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除车机操作配置
|
||||||
|
export function delVehOper(configId) {
|
||||||
|
return request({
|
||||||
|
url: '/system/vehOper/' + configId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
85
src/api/test/config.js
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询任务流程编排列表
|
||||||
|
export function listConfig(query) {
|
||||||
|
return request({
|
||||||
|
url: '/test/config/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询任务流程编排详细
|
||||||
|
export function getConfig(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/config/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增任务流程编排
|
||||||
|
export function addConfig(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/config',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function copyConfig(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/config/copy/' + id,
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改任务流程编排
|
||||||
|
export function updateConfig(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/config',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除任务流程编排
|
||||||
|
export function delConfig(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/config/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 流程编排
|
||||||
|
export function taskConfig(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/orchestration',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 流程编排查询
|
||||||
|
export function getTaskConfig(params) {
|
||||||
|
return request({
|
||||||
|
url: `/test/orchestration`,
|
||||||
|
method: 'get',
|
||||||
|
params: params
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取任务执行参数
|
||||||
|
export function getTaskParamsById(id) {
|
||||||
|
return request({
|
||||||
|
url: `/test/param/query/${id}`,
|
||||||
|
method: 'get',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 任务执行
|
||||||
|
export function taskExecute(data) {
|
||||||
|
return request({
|
||||||
|
url: `/flow/execute`,
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
51
src/api/test/detect.js
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询检测项配置列表
|
||||||
|
export function listDetect(query) {
|
||||||
|
return request({
|
||||||
|
url: '/test/detect/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询检测项配置详细
|
||||||
|
export function getDetect(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/detect/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增检测项配置
|
||||||
|
export function addDetect(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/detect',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function copyDetect(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/detect/copy/' + id,
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改检测项配置
|
||||||
|
export function updateDetect(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/detect',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除检测项配置
|
||||||
|
export function delDetect(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/detect/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
92
src/api/test/log.js
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询检测项日志列表
|
||||||
|
export function listLog(query) {
|
||||||
|
return request({
|
||||||
|
url: '/test/log/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询检测项日志详细
|
||||||
|
export function getLog(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/log/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增检测项日志
|
||||||
|
export function addLog(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/log',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改检测项日志
|
||||||
|
export function updateLog(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/log',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除检测项日志
|
||||||
|
export function delLog(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/log/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询任务实例列表
|
||||||
|
export function listInst(query) {
|
||||||
|
return request({
|
||||||
|
url: '/test/inst/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用历史实例保存的执行参数创建新的任务实例
|
||||||
|
export function rerunInst(id) {
|
||||||
|
return request({
|
||||||
|
url: `/test/inst/rerun/${id}`,
|
||||||
|
method: 'post'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询任务实例日志
|
||||||
|
export function getInst(query) {
|
||||||
|
return request({
|
||||||
|
url: '/test/inst/log/detail',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询任务实例日志
|
||||||
|
export function getFlowRuntimeLog(query) {
|
||||||
|
return request({
|
||||||
|
url: '/test/inst/log/query',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function pauseInst(id) {
|
||||||
|
return request({ url: `/test/inst/pause/${id}`, method: 'post' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function resumeInst(id) {
|
||||||
|
return request({ url: `/test/inst/resume/${id}`, method: 'post' })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function stopInst(id) {
|
||||||
|
return request({ url: `/test/inst/stop/${id}`, method: 'post' })
|
||||||
|
}
|
||||||
|
|
||||||
60
src/api/test/params.js
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询参数配置列表
|
||||||
|
export function listParams(query) {
|
||||||
|
return request({
|
||||||
|
url: '/test/param/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询参数配置详细
|
||||||
|
export function getParams(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/param/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增参数配置
|
||||||
|
export function addParams(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/param',
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改参数配置
|
||||||
|
export function updateParams(data) {
|
||||||
|
return request({
|
||||||
|
url: '/test/param',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除参数配置
|
||||||
|
export function delParams(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/param/' + id,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 参数来源
|
||||||
|
export function getParamSources(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/param/sources',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 参数类型
|
||||||
|
export function getParamTypes(id) {
|
||||||
|
return request({
|
||||||
|
url: '/test/param/types',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
85
src/api/tool/gen.js
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询生成表数据
|
||||||
|
export function listTable(query) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 查询db数据库列表
|
||||||
|
export function listDbTable(query) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/db/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询表详细信息
|
||||||
|
export function getGenTable(tableId) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/' + tableId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改代码生成信息
|
||||||
|
export function updateGenTable(data) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen',
|
||||||
|
method: 'put',
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导入表
|
||||||
|
export function importTable(data) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/importTable',
|
||||||
|
method: 'post',
|
||||||
|
params: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建表
|
||||||
|
export function createTable(data) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/createTable',
|
||||||
|
method: 'post',
|
||||||
|
params: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 预览生成代码
|
||||||
|
export function previewTable(tableId) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/preview/' + tableId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除表数据
|
||||||
|
export function delTable(tableId) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/' + tableId,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成代码(自定义路径)
|
||||||
|
export function genCode(tableName) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/genCode/' + tableName,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 同步数据库
|
||||||
|
export function synchDb(tableName) {
|
||||||
|
return request({
|
||||||
|
url: '/tool/gen/synchDb/' + tableName,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
BIN
src/assets/401_images/401.gif
Normal file
|
After Width: | Height: | Size: 160 KiB |
BIN
src/assets/404_images/404.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
src/assets/404_images/404_cloud.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
1
src/assets/icons/svg/404.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
4
src/assets/icons/svg/add.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<svg t="1783317138800" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12777" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200">
|
||||||
|
<path d="M898.004474 894.186428 798.735272 894.186428 798.735272 993.45563C798.735272 1009.90301 785.401891 1023.236391 768.954512 1023.236391 752.507132 1023.236391 739.173751 1009.90301 739.173751 993.45563L739.173751 894.186428 639.904549 894.186428C623.457169 894.186428 610.123788 880.853047 610.123788 864.405667 610.123788 847.958288 623.457169 834.624907 639.904549 834.624907L739.173751 834.624907 739.173751 735.355705C739.173751 718.908325 752.507132 705.574944 768.954512 705.574944 785.401891 705.574944 798.735272 718.908325 798.735272 735.355705L798.735272 834.624907 898.004474 834.624907C914.451854 834.624907 927.785235 847.958288 927.785235 864.405667 927.785235 880.853047 914.451854 894.186428 898.004474 894.186428ZM768.954512 641.049963C752.507132 641.049963 739.173751 627.716582 739.173751 611.269202L739.173751 60.32513 415.012081 60.32513C415.013608 60.452653 415.021626 60.579031 415.021626 60.706935L415.021626 291.316928C415.021626 307.764307 401.688245 321.097688 385.240865 321.097688L155.776286 321.097688 155.776286 836.152125 515.054437 836.152125C531.501817 836.152125 544.835198 849.485506 544.835198 865.932886 544.835198 882.380265 531.501817 895.713647 515.054437 895.713647L125.995526 895.713647C109.548146 895.713647 96.214765 882.380265 96.214765 865.932886L96.214765 242.064131C96.214765 237.412987 97.282291 233.011544 99.18406 229.089647 99.90567 226.826309 101.078574 224.786327 102.737515 223.086151L309.85087 10.837906C310.512919 10.088805 311.210476 9.372158 311.943541 8.693309L314.300802 6.277632C317.094849 3.414097 320.879296 1.89146 325.120764 1.610452 327.381429 1.061417 329.7406 0.763609 332.170022 0.763609L768.954512 0.763609C785.401891 0.763609 798.735272 14.09699 798.735272 30.54437L798.735272 611.269202C798.735272 627.716582 785.401891 641.049963 768.954512 641.049963ZM344.780647 60.32513 155.776286 254.015761 155.776286 261.536167 355.460104 261.536167 355.460104 60.706935C355.460104 60.579031 355.468122 60.452653 355.46965 60.32513L344.780647 60.32513Z" p-id="12778" fill="currentColor"></path>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.3 KiB |
1
src/assets/icons/svg/bell.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1773923748724" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5930" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 212l48.8 12c101.6 24.8 176 117.6 176 220.8v254.4l18.4 18.4 24.8 25.6h-536l24.8-25.6 18.4-18.4V444.8c0-103.2 73.6-196.8 176-220.8l48.8-12M512 64c-36.8 0-64 30.4-64 68v30.4C320.8 192 223.2 307.2 223.2 444.8v228.8L136 763.2v44.8h752v-44.8l-87.2-89.6V444.8c0-137.6-97.6-252.8-224.8-283.2v-28.8c0-32-17.6-60.8-48-67.2-5.6-1.6-11.2-1.6-16-1.6z m88 808H424c0 49.6 38.4 88 88 88s88-38.4 88-88z" p-id="5931"></path></svg>
|
||||||
|
After Width: | Height: | Size: 750 B |
54
src/assets/icons/svg/bot.svg
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<svg
|
||||||
|
viewBox="0 0 22 22"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
fill="none"
|
||||||
|
>
|
||||||
|
<rect width="22" height="22" x="0" y="0" />
|
||||||
|
<path
|
||||||
|
d="M11 7.33335L11 3.66669L7.33331 3.66669"
|
||||||
|
fill-rule="nonzero"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="1.833333"
|
||||||
|
/>
|
||||||
|
<rect
|
||||||
|
width="14.666667"
|
||||||
|
height="11.000000"
|
||||||
|
x="3.666687"
|
||||||
|
y="7.333344"
|
||||||
|
rx="1.833333"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="1.833333"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M1.83331 12.8333L3.66665 12.8333"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="1.833333"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M18.3333 12.8333L20.1666 12.8333"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="1.833333"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M13.75 11.9167L13.75 13.75"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="1.833333"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M8.25 11.9167L8.25 13.75"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="1.833333"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
1
src/assets/icons/svg/bug.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
1
src/assets/icons/svg/build.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1568899741379" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2054" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M960 591.424V368.96c0-0.288 0.16-0.512 0.16-0.768S960 367.68 960 367.424V192a32 32 0 0 0-32-32H96a32 32 0 0 0-32 32v175.424c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768v222.464c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768V864a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32v-271.04c0-0.288 0.16-0.512 0.16-0.768S960 591.68 960 591.424z m-560-31.232v-160H608v160h-208z m208 64V832h-208v-207.808H608z m-480-224h208v160H128v-160z m544 0h224v160h-224v-160zM896 224v112.192H128V224h768zM128 624.192h208V832H128v-207.808zM672 832v-207.808h224V832h-224z" p-id="2055"></path></svg>
|
||||||
|
After Width: | Height: | Size: 954 B |
1
src/assets/icons/svg/button.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></path></svg>
|
||||||
|
After Width: | Height: | Size: 2.3 KiB |
1
src/assets/icons/svg/cascader.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1576153230908" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="971" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M772.87036133 734.06115723c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714843H475.90991211c-56.60705567 0-102.66723633-46.06018067-102.66723633-102.66723633V600.82446289h305.859375c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012S827.9942627 467.50537109 772.87036133 467.50537109c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714844H373.24267578V401.01062011h321.92687989c55.12390137 0 99.94812012-44.82421875 99.94812011-99.94812011V190.07312011C795.11767578 134.94921875 750.29345703 90.125 695.16955567 90.125H251.12963867C196.0057373 90.125 151.18151855 134.94921875 151.18151855 190.07312011V301.0625c0 55.12390137 44.82421875 99.94812012 99.94812012 99.94812012h55.53588867v296.96044921c0 93.35632325 75.97045898 169.32678223 169.32678224 169.32678223h203.19213866c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012s-44.90661622-99.86572266-100.03051758-99.86572265z m0-199.89624024c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857423s-14.91394043 33.28857422-33.28857422 33.28857421-33.28857422-14.91394043-33.28857422-33.28857421 14.91394043-33.28857422 33.28857422-33.28857422zM217.75866699 301.0625V190.07312011c0-18.37463379 14.91394043-33.28857422 33.28857423-33.28857421h444.03991698c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857422V301.0625c0 18.37463379-14.91394043 33.28857422-33.28857422 33.28857422H251.12963867c-18.37463379 0-33.37097168-14.91394043-33.37097168-33.28857422z m555.11169434 566.23535156c-18.37463379 0-33.28857422-14.91394043-33.28857422-33.28857422 0-18.37463379 14.91394043-33.28857422 33.28857422-33.28857422s33.28857422 14.91394043 33.28857422 33.28857422c0.08239747 18.29223633-14.91394043 33.28857422-33.28857422 33.28857422z" p-id="972"></path></svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
1
src/assets/icons/svg/chart.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>
|
||||||
|
After Width: | Height: | Size: 179 B |
1
src/assets/icons/svg/checkbox.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575982282951" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="902" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M828.40625 90.125H195.59375C137.375 90.125 90.125 137.375 90.125 195.59375v632.8125c0 58.21875 47.25 105.46875 105.46875 105.46875h632.8125c58.21875 0 105.46875-47.25 105.46875-105.46875V195.59375c0-58.21875-47.25-105.46875-105.46875-105.46875z m52.734375 738.28125c0 29.16-23.57015625 52.734375-52.734375 52.734375H195.59375c-29.109375 0-52.734375-23.574375-52.734375-52.734375V195.59375c0-29.109375 23.625-52.734375 52.734375-52.734375h632.8125c29.16 0 52.734375 23.625 52.734375 52.734375v632.8125z" p-id="903"></path><path d="M421.52890625 709.55984375a36.28125 36.28125 0 0 1-27.55265625-12.66890625L205.17453125 476.613125a36.28546875 36.28546875 0 0 1 55.10109375-47.22890625l164.986875 192.4846875 342.16171875-298.48078125a36.2896875 36.2896875 0 0 1 47.70984375 54.68765625L445.3859375 700.6203125a36.3234375 36.3234375 0 0 1-23.85703125 8.93953125z" p-id="904"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
4
src/assets/icons/svg/chevron-down.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.000000" height="24.000000" fill="none" customFrame="#000000">
|
||||||
|
<rect id="chevron-down" width="24.000000" height="24.000000" x="0.000000" y="0.000000" />
|
||||||
|
<path id="矢量 82" d="M6 9L12 15L18 9" fill-rule="nonzero" stroke="rgb(0,212,255)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.000000" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 433 B |
4
src/assets/icons/svg/chevron-left.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.000000" height="24.000000" fill="none" customFrame="#000000">
|
||||||
|
<rect id="chevron-left" width="24.000000" height="24.000000" x="0.000000" y="0.000000" />
|
||||||
|
<path id="矢量 80" d="M15 18L9 12L15 6" fill-rule="nonzero" stroke="rgb(0,212,255)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.000000" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 434 B |
4
src/assets/icons/svg/chevron-right.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.000000" height="24.000000" fill="none" customFrame="#000000">
|
||||||
|
<rect id="chevron-right" width="24.000000" height="24.000000" x="0.000000" y="0.000000" />
|
||||||
|
<path id="矢量 81" d="M9 18L15 12L9 6" fill-rule="nonzero" stroke="rgb(0,212,255)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.000000" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 434 B |
16
src/assets/icons/svg/chevron-stop.svg
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<svg viewBox="0 0 52 52" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="52.000000" height="52.000000" fill="none" customFrame="url(#clipPath_0)">
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clipPath_0">
|
||||||
|
<rect width="52.000000" height="52.000000" x="0.000000" y="0.000000" rx="8.000000" fill="rgb(255,255,255)" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath_1">
|
||||||
|
<rect width="22.000000" height="22.000000" x="15.000000" y="15.000000" fill="rgb(255,255,255)" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<rect id="容器 86" width="52.000000" height="52.000000" x="0.000000" y="0.000000" rx="8.000000" fill="rgb(255,43,43)" fill-opacity="0.200000003" />
|
||||||
|
<g id="square" customFrame="url(#clipPath_1)">
|
||||||
|
<rect id="square" width="22.000000" height="22.000000" x="15.000000" y="15.000000" />
|
||||||
|
<rect id="矩形 13" width="16.500000" height="16.500000" x="17.750000" y="17.750000" rx="1.833333" stroke="rgb(255,43,43)" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.833333" />
|
||||||
|
</g>
|
||||||
|
<rect id="容器 86" width="51.000000" height="51.000000" x="0.500000" y="0.500000" rx="7.500000" stroke="rgb(255,43,43)" stroke-width="1.000000" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
4
src/assets/icons/svg/chevron-up.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24.000000" height="24.000000" fill="none" customFrame="#000000">
|
||||||
|
<rect id="chevron-up" width="24.000000" height="24.000000" x="0.000000" y="0.000000" />
|
||||||
|
<path id="矢量 79" d="M18 15L12 9L6 15" fill-rule="nonzero" stroke="rgb(0,212,255)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2.000000" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 432 B |
1
src/assets/icons/svg/clipboard.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>
|
||||||
|
After Width: | Height: | Size: 971 B |
1
src/assets/icons/svg/code.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" p-id="2423"></path></svg>
|
||||||
|
After Width: | Height: | Size: 717 B |
1
src/assets/icons/svg/color.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577252187056" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2508" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M747.59340925 691.12859384c11.51396329 0.25305413 22.43746719-0.21087818 40.74171707-1.51832482 29.35428085-2.10878421 35.84933734-2.36183835 46.47761114-0.8856895 24.71495444 3.37405491 41.12129828 21.76265671 32.47528161 47.95376084-85.57447632 258.19957947-442.00123984 249.76444099-628.67084683 50.73735554-153.47733892-159.33976008-153.09775772-414.41833795 0.92786545-573.42069196 159.71934128-162.67163983 424.03439521-166.59397897 565.78689185 0.63263534 80.38686649 94.81095318 108.34934958 169.16669549 89.11723508 230.57450162-15.01454608 47.99593598-50.61082928 77.68762207-119.77896259 114.63352789-4.89237973 2.65706845-29.35428085 15.52065436-35.84933652 19.02123633-46.94154346 25.30541465-63.51659033 41.20565021-62.20914449 58.45550757 2.95229856 39.13904114 24.16667102 52.7196135 70.98168823 53.81618115z m44.41100207 50.10472101c-19.82257471 1.43397372-32.05352527 1.940082-45.63409763 1.6448519-70.34905207-1.60267593-115.98314969-30.91478165-121.38163769-101.64341492-3.45840683-46.05585397 24.7571304-73.13264758 89.24376132-107.96976837 6.7902866-3.66928501 31.37871396-16.57504688 36.06021551-19.06341229 57.69634516-30.83042972 85.15271997-53.73183005 94.76877722-84.47790866 12.77923398-40.78389304-9.10994898-98.94417051-79.24812286-181.6507002-121.17075953-142.97559219-350.14258521-139.60153647-489.2380134 2.06660824-134.49827774 138.84237405-134.79350784 362.12048163-0.42175717 501.637667 158.53842169 168.99799328 451.9968783 181.18676788 534.57688175-11.80919339-4.68150156 0.2952301-10.71262573 0.67481131-18.72600705 1.26527069z" p-id="2509"></path><path d="M346.03865637 637.18588562a78.82636652 78.82636652 0 0 0 78.32025825-79.29029883c0-43.69401562-35.005823-79.29029883-78.32025825-79.29029882a78.82636652 78.82636652 0 0 0-78.36243338 79.29029882c0 43.69401562 35.005823 79.29029883 78.36243338 79.29029883z m0-51.7495729a27.07679361 27.07679361 0 0 1-26.5706845-27.54072593c0-15.30977536 11.97789643-27.54072593 26.5706845-27.54072592 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072592a27.07679361 27.07679361 0 0 1-26.57068533 27.54072593zM475.7289063 807.11174353a78.82636652 78.82636652 0 0 0 78.3624334-79.29029882c0-43.69401562-34.96364785-79.29029883-78.32025825-79.29029883a78.82636652 78.82636652 0 0 0-78.32025742 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029882z m0-51.74957208a27.07679361 27.07679361 0 0 1-26.57068532-27.54072674c0-15.30977536 12.06224753-27.54072593 26.57068532-27.54072593 14.59278892 0 26.57068533 12.23095057 26.57068453 27.54072593a27.07679361 27.07679361 0 0 1-26.57068453 27.54072674zM601.24376214 377.21492718a78.82636652 78.82636652 0 0 0 78.32025742-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025742-79.29029882a78.82636652 78.82636652 0 0 0-78.32025823 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025824 79.29029883z m1e-8-51.74957208a27.07679361 27.07679361 0 0 1-26.57068534-27.54072675c0-15.30977536 11.97789643-27.54072593 26.57068534-27.54072591 14.55061295 0 26.57068533 12.23095057 26.57068451 27.54072592a27.07679361 27.07679361 0 0 1-26.57068451 27.54072674zM378.80916809 433.85687983a78.82636652 78.82636652 0 0 0 78.32025824-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025824-79.29029802a78.82636652 78.82636652 0 0 0-78.32025742 79.29029802c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029883z m0-51.74957209a27.07679361 27.07679361 0 0 1-26.57068451-27.54072674c0-15.30977536 11.97789643-27.54072593 26.57068451-27.54072593 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072593a27.07679361 27.07679361 0 0 1-26.57068533 27.54072674z" p-id="2510"></path></svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
1
src/assets/icons/svg/component.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575804206892" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3145" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M826.56 470.016c-32.896 0-64.384 12.288-89.984 35.52l0-104.96c0-62.208-50.496-112.832-112.64-113.088L623.936 287.04 519.552 287.104C541.824 262.72 554.56 230.72 554.56 197.12c0-73.536-59.904-133.44-133.504-133.44-73.472 0-133.376 59.904-133.376 133.44 0 32.896 12.224 64.256 35.52 89.984L175.232 287.104l0 0.576C113.728 288.704 64 338.88 64 400.576l0.32 0 0.32 116.48C60.864 544.896 70.592 577.728 100.8 588.48c12.736 4.608 37.632 7.488 60.864-25.28 12.992-18.368 34.24-29.248 56.64-29.248 38.336 0 69.504 31.104 69.504 69.312 0 38.4-31.168 69.504-69.504 69.504-22.656 0-44.032-11.264-57.344-30.4C138.688 610.112 112.576 615.36 102.464 619.136c-29.824 10.752-39.104 43.776-38.144 67.392l0 160.384L64 846.912C64 909.248 114.752 960 177.216 960l446.272 0c62.4 0 113.152-50.752 113.152-113.152l0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.536 0 133.44-59.904 133.44-133.504C960 529.92 900.096 470.016 826.56 470.016zM826.56 672.896c-22.72 0-44.032-11.264-57.344-30.4-22.272-32.384-48.448-27.136-58.56-23.36-29.824 10.752-39.04 43.776-38.08 67.392l0 160.384c0 27.136-22.016 49.152-49.152 49.152L177.216 896.064C150.08 896 128 873.984 128 846.848l0.32 0 0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.6 0 133.504-59.904 133.504-133.504 0-73.472-59.904-133.376-133.504-133.376-32.896 0-64.32 12.288-89.984 35.52l0-104.96L128 400.512c0-27.072 22.08-49.152 49.216-49.152L177.216 351.04 334.656 350.72c3.776 0.512 7.616 0.832 11.52 0.832 24.896 0 50.752-10.816 60.032-37.056 4.544-12.736 7.424-37.568-25.344-60.736C362.624 240.768 351.68 219.52 351.68 197.12c0-38.272 31.104-69.44 69.376-69.44 38.336 0 69.504 31.168 69.504 69.44 0 22.72-11.264 44.032-30.528 57.472C427.968 276.736 433.088 302.784 436.8 313.024c10.752 29.888 43.072 39.232 67.392 38.08l119.232 0 0 0.384c27.136 0 49.152 22.08 49.152 49.152l0.256 116.48c-3.776 27.84 6.016 60.736 36.224 71.488 12.736 4.608 37.632 7.488 60.8-25.28 13.056-18.368 34.24-29.248 56.704-29.248C864.832 534.016 896 565.12 896 603.392 896 641.728 864.832 672.896 826.56 672.896z" p-id="3146"></path></svg>
|
||||||
|
After Width: | Height: | Size: 2.4 KiB |
1
src/assets/icons/svg/consuming.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1783317313942" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17054" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M672.881778 502.215111a225.28 225.28 0 0 1-77.141334 50.688A225.450667 225.450667 0 0 1 512 568.888889a225.450667 225.450667 0 0 1-83.740444-15.928889 225.28 225.28 0 0 1-77.141334-50.744889 225.223111 225.223111 0 0 1-50.688-77.141333A225.564444 225.564444 0 0 1 284.444444 341.333333c0-28.672 5.347556-57.116444 15.928889-83.740444 11.605333-29.240889 28.501333-54.954667 50.744889-77.141333a225.28 225.28 0 0 1 77.141334-50.688A225.564444 225.564444 0 0 1 512 113.777778c28.672 0 57.116444 5.347556 83.740444 15.928889 29.240889 11.605333 54.954667 28.501333 77.141334 50.744889 22.186667 22.186667 39.139556 47.900444 50.688 77.141333 10.638222 26.624 16.042667 55.068444 15.985778 83.740444 0 28.672-5.404444 57.116444-15.928889 83.740445a225.28 225.28 0 0 1-50.744889 77.141333z m-50.801778-270.961778a154.168889 154.168889 0 0 0-52.792889-34.702222A154.339556 154.339556 0 0 0 512 185.628444c-19.626667 0-39.082667 3.697778-57.287111 10.922667a154.112 154.112 0 0 0-52.792889 34.702222c-15.075556 15.018667-26.908444 32.995556-34.702222 52.792889-7.224889 18.204444-10.922667 37.660444-10.922667 57.287111 0 19.797333 3.640889 38.912 10.922667 57.287111 7.793778 19.797333 19.626667 37.774222 34.702222 52.792889 15.018667 15.075556 32.995556 26.908444 52.792889 34.702223 18.204444 7.224889 37.660444 10.979556 57.287111 10.922666 19.626667 0 39.082667-3.697778 57.287111-10.922666 19.797333-7.793778 37.774222-19.626667 52.792889-34.702223 15.075556-15.018667 26.908444-32.995556 34.702222-52.792889 7.224889-18.204444 10.922667-37.660444 10.922667-57.287111 0-19.626667-3.697778-39.082667-10.922667-57.287111a153.998222 153.998222 0 0 0-34.702222-52.792889z" p-id="17055" fill="currentColor"></path><path d="M228.750222 616.220444a388.152889 388.152889 0 0 1 122.481778-88.177777 368.64 368.64 0 0 1 134.371556-33.052445 33.678222 33.678222 0 0 1 25.144888 9.671111c6.883556 6.599111 10.979556 15.928889 11.434667 25.770667a38.912 38.912 0 0 1-8.931555 26.851556 34.133333 34.133333 0 0 1-24.177778 12.288 302.819556 302.819556 0 0 0-110.364445 27.192888 318.691556 318.691556 0 0 0-100.579555 72.362667 342.357333 342.357333 0 0 0-68.380445 106.951111 359.992889 359.992889 0 0 0-26.055111 117.703111c-1.024 20.593778-17.578667 36.408889-36.864 35.271111a34.133333 34.133333 0 0 1-24.120889-12.401777 38.912 38.912 0 0 1-8.874666-26.965334 438.385778 438.385778 0 0 1 31.687111-143.246222 416.938667 416.938667 0 0 1 83.228444-130.275555z m426.894222 333.824c-19.342222 0-34.986667-16.725333-34.986666-37.319111v-231.537777c0-20.650667 15.644444-37.319111 34.986666-37.319112 19.342222 0 34.986667 16.668444 34.986667 37.319112v231.537777c0 20.593778-15.644444 37.319111-34.986667 37.319111z m-111.957333-61.610666c-19.342222 0-34.986667-16.725333-34.986667-37.319111V744.675556c0-20.650667 15.644444-37.376 34.986667-37.376 19.342222 0 34.986667 16.725333 34.986667 37.376v106.382222c0 20.650667-15.701333 37.376-34.986667 37.376z m223.971556 0c-19.342222 0-34.986667-16.725333-34.986667-37.319111V744.675556c0-20.650667 15.644444-37.376 34.986667-37.376 19.342222 0 34.986667 16.725333 34.986666 37.376v106.382222c0 20.650667-15.701333 37.376-34.986666 37.376zM967.111111 797.013333c0 20.593778-15.644444 37.319111-34.986667 37.319111h-45.511111c-19.342222 0-34.986667-16.725333-34.986666-37.319111 0-20.650667 15.644444-37.376 34.986666-37.376h45.511111c19.342222 0 34.986667 16.725333 34.986667 37.376z" p-id="17056" fill="currentColor"></path></svg>
|
||||||
|
After Width: | Height: | Size: 3.7 KiB |
17
src/assets/icons/svg/cpu.svg
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16.000000" height="16.000000" fill="none" customFrame="#000000">
|
||||||
|
<rect id="cpu" width="16.000000" height="16.000000" x="0.000000" y="0.000000" />
|
||||||
|
<path id="矢量 61" d="M8 13.3333L8 14.6666" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 62" d="M8 1.33331L8 2.66665" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 63" d="M11.3334 13.3333L11.3334 14.6666" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 64" d="M11.3334 1.33331L11.3334 2.66665" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 65" d="M1.33337 8L2.66671 8" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 66" d="M1.33337 11.3333L2.66671 11.3333" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 67" d="M1.33337 4.66669L2.66671 4.66669" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 68" d="M13.3334 8L14.6667 8" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 69" d="M13.3334 11.3333L14.6667 11.3333" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 70" d="M13.3334 4.66669L14.6667 4.66669" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 71" d="M4.66663 13.3333L4.66663 14.6666" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 72" d="M4.66663 1.33331L4.66663 2.66665" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<rect id="矩形 7" width="10.666667" height="10.666667" x="2.666626" y="2.666687" rx="1.333333" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<rect id="矩形 8" width="5.333333" height="5.333333" x="5.333374" y="5.333313" rx="0.666667" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.4 KiB |
1
src/assets/icons/svg/dashboard.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
|
||||||
|
After Width: | Height: | Size: 2.3 KiB |
1
src/assets/icons/svg/date-range.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1579774833889" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1376" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M887.466667 192.853333h-100.693334V119.466667c0-10.24-6.826667-17.066667-17.066666-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H303.786667V119.466667c0-10.24-6.826667-17.066667-17.066667-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H168.96c-46.08 0-85.333333 37.546667-85.333333 85.333334V836.266667c0 46.08 37.546667 85.333333 85.333333 85.333333H887.466667c46.08 0 85.333333-37.546667 85.333333-85.333333V278.186667c0-47.786667-37.546667-85.333333-85.333333-85.333334z m-718.506667 34.133334h100.693333v66.56c0 10.24 6.826667 17.066667 17.066667 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56h450.56v66.56c0 10.24 6.826667 17.066667 17.066666 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56H887.466667c27.306667 0 51.2 22.186667 51.2 51.2v88.746666H117.76v-88.746666c0-29.013333 22.186667-51.2 51.2-51.2zM887.466667 887.466667H168.96c-27.306667 0-51.2-22.186667-51.2-51.2V401.066667H938.666667V836.266667c0 27.306667-22.186667 51.2-51.2 51.2z" p-id="1377"></path><path d="M858.453333 493.226667H327.68c-10.24 0-17.066667 6.826667-17.066667 17.066666v114.346667h-116.053333c-10.24 0-17.066667 6.826667-17.066667 17.066667v133.12c0 10.24 6.826667 17.066667 17.066667 17.066666H460.8c10.24 0 17.066667-6.826667 17.066667-17.066666v-114.346667h380.586666c10.24 0 17.066667-6.826667 17.066667-17.066667v-133.12c0-10.24-6.826667-17.066667-17.066667-17.066666z m-413.013333 34.133333v97.28h-98.986667v-97.28h98.986667z m-230.4 131.413333h98.986667v98.986667h-98.986667v-98.986667z m131.413333 97.28v-97.28h98.986667v97.28h-98.986667z m133.12-228.693333h97.28v98.986667h-97.28v-98.986667z m131.413334 0h98.986666v98.986667h-98.986666v-98.986667z m230.4 97.28h-98.986667v-98.986667h98.986667v98.986667z" p-id="1378"></path></svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
1
src/assets/icons/svg/date.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577186573535" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1068" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M479.85714249 608.42857168h64.28571502c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285751s-12.85714249-32.14285751-32.14285664-32.14285664h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285662s12.85714249 32.14285751 32.14285664 32.14285753z m-2e-8 122.14285665h64.28571504c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285665s-12.85714249-32.14285751-32.14285664-32.14285751h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285751s12.85714249 32.14285751 32.14285664 32.14285664z m353.57142921-559.28571416h-128.57142921v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285664-32.14285753s-32.14285751 12.85714249-32.14285751 32.14285753v32.14285664h-257.14285665v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285752-32.14285753s-32.14285751 12.85714249-32.14285664 32.14285753v32.14285664h-128.57142919c-70.71428585 0-128.57142832 57.85714249-128.57142832 122.14285751v501.42857081c0 70.71428585 57.85714249 128.57142832 128.57142832 122.14285751h642.85714335c70.71428585 0 128.57142832-57.85714249 128.57142833-122.14285751v-501.42857081c0-70.71428585-57.85714249-122.14285753-128.57142833-122.14285751z m64.28571415 623.57142832c0 32.14285751-32.14285751 64.28571415-64.28571416 64.28571504h-642.85714335c-32.14285751 0-64.28571415-25.71428583-64.28571417-64.28571504v-372.85714249h771.42857168v372.85714249z m0-437.14285664h-771.42857168v-64.28571417c0-32.14285751 32.14285751-64.28571415 64.28571417-64.28571415h128.57142919v32.14285664c0 19.28571417 12.85714249 32.14285751 32.14285664 32.14285751s32.14285751-12.85714249 32.14285753-32.14285751v-32.14285664h257.14285665v32.14285664c0 19.28571417 12.85714249 32.14285751 32.1428575 32.14285751s32.14285751-12.85714249 32.14285664-32.14285751v-32.14285664h128.57142921c32.14285751 0 64.28571415 25.71428583 64.28571415 64.28571415v64.28571417z m-610.71428583 372.85714247h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285664s-12.85714249-32.14285751-32.14285753-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285751s12.85714249 32.14285751 32.14285751 32.14285665z m385.71428583-122.14285664h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285751s-12.85714249-32.14285751-32.14285751-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285664s12.85714249 32.14285751 32.14285753 32.14285751z m-385.71428583 0h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285751s-12.85714249-32.14285751-32.14285753-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285664s12.85714249 32.14285751 32.14285751 32.14285751z m385.71428583 122.14285665h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285665s-12.85714249-32.14285751-32.14285751-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285751s12.85714249 32.14285751 32.14285753 32.14285665z" p-id="1069"></path></svg>
|
||||||
|
After Width: | Height: | Size: 3.3 KiB |
1
src/assets/icons/svg/dict.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035680909" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3601" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1002.0848 744.672l-33.568 10.368c0.96 7.264 2.144 14.304 2.144 21.76 0 7.328-1.184 14.432-2.368 21.568l33.792 10.56c7.936 2.24 14.496 7.616 18.336 14.752 3.84 7.328 4.672 15.808 1.952 23.552-5.376 16-23.168 24.672-39.936 19.68l-34.176-10.624c-7.136 12.8-15.776 24.672-26.208 35.2l20.8 27.488a28.96 28.96 0 0 1 5.824 22.816 29.696 29.696 0 0 1-12.704 19.616 32.544 32.544 0 0 1-44.416-6.752l-20.8-27.552c-13.696 6.56-28.192 11.2-43.008 13.888v33.632c0 16.736-14.112 30.432-31.648 30.432-17.6 0-31.872-13.696-31.872-30.432v-33.632a167.616 167.616 0 0 1-42.88-13.888l-20.928 27.552c-10.72 13.76-30.08 16.64-44.288 6.752a29.632 29.632 0 0 1-12.704-19.616 29.28 29.28 0 0 1 5.696-22.816l20.896-27.808a166.72 166.72 0 0 1-27.008-34.688l-33.376 10.432c-16.8 5.184-34.56-3.552-39.936-19.616a29.824 29.824 0 0 1 20.224-38.24l33.472-10.432c-0.8-7.264-2.016-14.304-2.016-21.824 0-7.36 1.184-14.496 2.304-21.632l-33.792-10.368c-16.672-5.376-25.632-22.496-20.224-38.432 5.376-16 23.136-24.672 39.936-19.68l34.016 10.752c7.328-12.672 15.84-24.8 26.336-35.328l-20.8-27.552a29.44 29.44 0 0 1 6.944-42.432 32.704 32.704 0 0 1 44.384 6.752l20.832 27.616c13.696-6.432 28.224-11.2 43.104-13.952v-33.568c0-16.736 14.048-30.432 31.648-30.432 17.536 0 31.808 13.568 31.808 30.432v33.504c15.072 2.688 29.344 7.808 42.848 14.016l20.992-27.616a32.48 32.48 0 0 1 44.224-6.752 29.568 29.568 0 0 1 7.136 42.432l-21.024 27.808c10.432 10.432 19.872 21.888 27.04 34.752l33.376-10.432c16.768-5.12 34.56 3.68 39.936 19.68 5.536 15.936-3.712 33.056-20.32 38.304z m-206.016-74.432c-61.344 0-111.136 47.808-111.136 106.56 0 58.88 49.792 106.496 111.136 106.496 61.312 0 111.104-47.616 111.104-106.496 0-58.752-49.792-106.56-111.104-106.56z" p-id="3602"></path><path d="M802.7888 57.152h-76.448c0-22.08-21.024-38.24-42.848-38.24H39.3968a39.68 39.68 0 0 0-39.36 40.032v795.616s41.888 120.192 110.752 120.192H673.2848a227.488 227.488 0 0 1-107.04-97.44H117.6368s-40.608-13.696-40.608-41.248l470.304-0.256 1.664 3.36a227.68 227.68 0 0 1-12.64-73.632c0-60.576 24-118.624 66.88-161.44a228.352 228.352 0 0 1 123.552-63.392l-3.2 0.288 2.144-424.672h38.208l0.576 421.024c27.04 0 52.672 4.8 76.64 13.344V101.536c0.032 0-6.304-44.384-38.368-44.384zM149.7648 514.336H72.3888v-77.408H149.7648v77.408z m0-144.32H72.3888v-77.44H149.7648v77.44z m0-137.248H72.3888v-77.44H149.7648v77.44z m501.856 281.568H206.0848v-77.408h445.536v77.408z m0-144.32H206.0848v-77.44h445.536v77.44z m0-137.248H206.0848v-77.44h445.536v77.44z" p-id="3603"></path></svg>
|
||||||
|
After Width: | Height: | Size: 2.8 KiB |
1
src/assets/icons/svg/documentation.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M71.984 44.815H115.9L71.984 9.642v35.173zM16.094.05h63.875l47.906 38.37v76.74c0 3.392-1.682 6.645-4.677 9.044-2.995 2.399-7.056 3.746-11.292 3.746H16.094c-4.236 0-8.297-1.347-11.292-3.746-2.995-2.399-4.677-5.652-4.677-9.044V12.84C.125 5.742 7.23.05 16.094.05zm71.86 102.32V89.58h-71.86v12.79h71.86zm23.952-25.58V64H16.094v12.79h95.812z"/></svg>
|
||||||
|
After Width: | Height: | Size: 418 B |
1
src/assets/icons/svg/download.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1569915748289" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3062" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M768.35456 416a256 256 0 1 0-512 0 192 192 0 1 0 0 384v64a256 256 0 0 1-58.88-505.216 320.128 320.128 0 0 1 629.76 0A256.128 256.128 0 0 1 768.35456 864v-64a192 192 0 0 0 0-384z m-512 384h64v64H256.35456v-64z m448 0h64v64h-64v-64z" fill="#333333" p-id="3063"></path><path d="M539.04256 845.248V512.192a32.448 32.448 0 0 0-32-32.192c-17.664 0-32 14.912-32 32.192v333.056l-36.096-36.096a32.192 32.192 0 0 0-45.056 0.192 31.616 31.616 0 0 0-0.192 45.056l90.88 90.944a31.36 31.36 0 0 0 22.528 9.088 30.08 30.08 0 0 0 22.4-9.088l90.88-90.88a32.192 32.192 0 0 0-0.192-45.12 31.616 31.616 0 0 0-45.056-0.192l-36.096 36.096z" fill="#333333" p-id="3064"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
1
src/assets/icons/svg/drag.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M73.137 29.08h-9.209 29.7L63.886.093 34.373 29.08h20.49v27.035H27.238v17.948h27.625v27.133h18.274V74.063h27.41V56.115h-27.41V29.08zm-9.245 98.827l27.518-26.711H36.59l27.302 26.71zM.042 64.982l27.196 27.029V38.167L.042 64.982zm100.505-26.815V92.01l27.41-27.029-27.41-26.815z"/></svg>
|
||||||
|
After Width: | Height: | Size: 356 B |
1
src/assets/icons/svg/druid.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036347051" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5853" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M832 128H192a64.19 64.19 0 0 0-64 64v640a64.19 64.19 0 0 0 64 64h640a64.19 64.19 0 0 0 64-64V192a64.19 64.19 0 0 0-64-64z m0 703.89l-0.11 0.11H192.11l-0.11-0.11V768h640zM832 544H720L605.6 696.54 442.18 435.07 333.25 544H192v-64h114.75l147.07-147.07L610.4 583.46 688 480h144z m0-288H192v-63.89l0.11-0.11h639.78l0.11 0.11z" p-id="5854"></path></svg>
|
||||||
|
After Width: | Height: | Size: 724 B |
1
src/assets/icons/svg/edit.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></svg>
|
||||||
|
After Width: | Height: | Size: 818 B |
1
src/assets/icons/svg/education.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M88.883 119.565c-7.284 0-19.434 2.495-21.333 8.25v.127c-4.232.13-5.222 0-7.108 0-1.895-5.76-14.045-8.256-21.333-8.256H0V0h42.523c9.179 0 17.109 5.47 21.47 13.551C68.352 5.475 76.295 0 85.478 0H128v119.57l-39.113-.005h-.004zM60.442 24.763c0-9.651-8.978-16.507-17.777-16.507H7.108V111.43H39.11c7.054-.14 18.177.082 21.333 6.12v-4.628c-.134-5.722-.004-13.522 0-13.832V27.413l.004-2.655-.004.005zm60.442-16.517h-35.55c-8.802 0-17.78 6.856-17.78 16.493v74.259c.004.32.138 8.115 0 13.813v4.627c3.155-6.022 14.279-6.26 21.333-6.114h32V8.25l-.003-.005z"/></svg>
|
||||||
|
After Width: | Height: | Size: 627 B |
1
src/assets/icons/svg/email.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg>
|
||||||
|
After Width: | Height: | Size: 347 B |
1
src/assets/icons/svg/enter.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1746590936918" class="icon" viewBox="0 0 1194 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5378" xmlns:xlink="http://www.w3.org/1999/xlink" width="233.203125" height="200"><path d="M1151.9144 325.11999969V89.12a57.04000031 57.04000031 0 0 0-28.8-49.44 58.15999969 58.15999969 0 0 0-57.76000031 0 57.04000031 57.04000031 0 0 0-28.8 49.44v235.99999969c0.24 84.31999969-33.6 152.56000031-94.08 212.00000062-60.07999969 59.83999969-141.84 80.64-227.04 80.4H225.91440031L388.07439969 457.11999969a56.80000031 56.80000031 0 0 0 12.40000031-62.16 57.76000031 57.76000031 0 0 0-94.00000031-18.63999938L48.8744 631.20000031a56.88 56.88 0 0 0 0 80.79999938l264.96 262.56a58.08 58.08 0 0 0 96.55999969-25.59999938 56.80000031 56.80000031 0 0 0-14.95999969-55.2L232.07439969 731.67999969h483.44000062c116.56000031 0 226.15999969-32.08000031 308.64-113.76 82.15999969-80.80000031 128.23999969-178.15999969 127.83999938-292.87999969" p-id="5379"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
1
src/assets/icons/svg/example.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
|
||||||
|
After Width: | Height: | Size: 497 B |
1
src/assets/icons/svg/excel.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></svg>
|
||||||
|
After Width: | Height: | Size: 459 B |
1
src/assets/icons/svg/exit-fullscreen.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.8 KiB |
1
src/assets/icons/svg/eye-open.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
1
src/assets/icons/svg/eye.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
|
||||||
|
After Width: | Height: | Size: 944 B |
1
src/assets/icons/svg/form.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
|
||||||
|
After Width: | Height: | Size: 2.4 KiB |
1
src/assets/icons/svg/fullscreen.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg>
|
||||||
|
After Width: | Height: | Size: 421 B |
8
src/assets/icons/svg/gamepad.svg
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16.000000" height="16.000000" fill="none" customFrame="#000000">
|
||||||
|
<rect id="gamepad-2" width="16.000000" height="16.000000" x="0.000000" y="0.000000" />
|
||||||
|
<line id="直线 10" x1="4" x2="6.66666698" y1="7.33334351" y2="7.33334351" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<line id="直线 11" x1="0" x2="2.66666675" y1="0" y2="0" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" transform="matrix(0,1,-1,0,5.33337,6)" />
|
||||||
|
<line id="直线 12" x1="10" x2="10.0066671" y1="8" y2="8" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<line id="直线 13" x1="12" x2="12.0066671" y1="6.66665649" y2="6.66665649" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<path id="矢量 73" d="M4.45337 3.33334C4.01626 3.33345 3.58588 3.441 3.20011 3.64653C2.81433 3.85206 2.485 4.14928 2.24109 4.51201C1.99718 4.87474 1.84618 5.29187 1.80137 5.72668C1.79737 5.76134 1.79471 5.79401 1.79004 5.82801C1.73604 6.27734 1.33337 9.63734 1.33337 10.6667C1.33337 11.0177 1.42579 11.3626 1.60132 11.6667C1.77686 11.9707 2.02934 12.2232 2.33337 12.3987C2.63741 12.5743 2.9823 12.6667 3.33337 12.6667C4.00004 12.6667 4.33337 12.3333 4.66671 12L5.60937 11.0573C5.73316 10.9335 5.88011 10.8353 6.04186 10.7683C6.2036 10.7012 6.37696 10.6667 6.55204 10.6667L9.44804 10.6667C9.62312 10.6667 9.79648 10.7012 9.95823 10.7683C10.12 10.8353 10.2669 10.9335 10.3907 11.0573L11.3334 12C11.6667 12.3333 12 12.6667 12.6667 12.6667C13.0178 12.6667 13.3627 12.5743 13.6667 12.3987C13.9707 12.2232 14.2232 11.9707 14.3988 11.6667C14.5743 11.3626 14.6667 11.0177 14.6667 10.6667C14.6667 9.63668 14.264 6.27734 14.21 5.82801C14.2054 5.79468 14.2027 5.76134 14.1987 5.72734C14.154 5.29246 14.0031 4.87523 13.7592 4.5124C13.5153 4.14957 13.186 3.85226 12.8001 3.64666C12.4143 3.44105 11.9839 3.33346 11.5467 3.33334L4.45337 3.33334Z" fill-rule="nonzero" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
1
src/assets/icons/svg/github.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1581238998885" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4187" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M511.542857 14.057143C228.914286 13.942857 0 242.742857 0 525.142857 0 748.457143 143.2 938.285714 342.628571 1008c26.857143 6.742857 22.742857-12.342857 22.742858-25.371429v-88.571428c-155.085714 18.171429-161.371429-84.457143-171.771429-101.6C172.571429 756.571429 122.857143 747.428571 137.714286 730.285714c35.314286-18.171429 71.314286 4.571429 113.028571 66.171429 30.171429 44.685714 89.028571 37.142857 118.857143 29.714286 6.514286-26.857143 20.457143-50.857143 39.657143-69.485715-160.685714-28.8-227.657143-126.857143-227.657143-243.428571 0-56.571429 18.628571-108.571429 55.2-150.514286-23.314286-69.142857 2.171429-128.342857 5.6-137.142857 66.4-5.942857 135.428571 47.542857 140.8 51.771429 37.714286-10.171429 80.8-15.542857 129.028571-15.542858 48.457143 0 91.657143 5.6 129.714286 15.885715 12.914286-9.828571 76.914286-55.771429 138.628572-50.171429 3.314286 8.8 28.228571 66.628571 6.285714 134.857143 37.028571 42.057143 55.885714 94.514286 55.885714 151.2 0 116.8-67.428571 214.971429-228.571428 243.314286a145.714286 145.714286 0 0 1 43.542857 104v128.571428c0.914286 10.285714 0 20.457143 17.142857 20.457143 202.4-68.228571 348.114286-259.428571 348.114286-484.685714 0-282.514286-229.028571-511.2-511.428572-511.2z" p-id="4188"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
1
src/assets/icons/svg/guide.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.482 70.131l36.204 16.18 69.932-65.485-61.38 70.594 46.435 18.735c1.119.425 2.397-.17 2.797-1.363v-.085L127.998.047 1.322 65.874c-1.12.597-1.519 1.959-1.04 3.151.32.511.72.937 1.2 1.107zm44.676 57.821L64.22 107.26l-18.062-7.834v28.527z"/></svg>
|
||||||
|
After Width: | Height: | Size: 320 B |
1
src/assets/icons/svg/icon.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.147.062a13 13 0 0 1 4.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 0 1 2.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
1
src/assets/icons/svg/input.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575802859706" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3102" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 224H128c-35.2 0-64 28.8-64 64v448c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V288c0-35.2-28.8-64-64-64z m0 480c0 19.2-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V320c0-19.2 12.8-32 32-32h704c19.2 0 32 12.8 32 32v384z" p-id="3103"></path><path d="M224 352c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V384c0-16-12.8-32-32-32z" p-id="3104"></path></svg>
|
||||||
|
After Width: | Height: | Size: 744 B |
1
src/assets/icons/svg/international.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
1
src/assets/icons/svg/job.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036191400" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5472" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M934.912 1016.832H192c-14.336 0-25.6-11.264-25.6-25.6v-189.44c0-14.336 11.264-25.6 25.6-25.6s25.6 11.264 25.6 25.6v163.84h691.712V64H217.6v148.48c0 14.336-11.264 25.6-25.6 25.6s-25.6-11.264-25.6-25.6v-174.08c0-14.336 11.264-25.6 25.6-25.6h742.912c14.336 0 25.6 11.264 25.6 25.6v952.832c0 14.336-11.264 25.6-25.6 25.6z" p-id="5473"></path><path d="M232.96 371.2h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM232.96 540.16h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM232.96 698.88h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM574.464 762.88c-134.144 0-243.2-109.056-243.2-243.2S440.32 276.48 574.464 276.48s243.2 109.056 243.2 243.2-109.056 243.2-243.2 243.2z m0-435.2c-105.984 0-192 86.016-192 192S468.48 711.68 574.464 711.68s192-86.016 192-192S680.448 327.68 574.464 327.68z" p-id="5474"></path><path d="M663.04 545.28h-87.04c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h87.04c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6z" p-id="5475"></path><path d="M576 545.28c-14.336 0-25.6-11.264-25.6-25.6v-87.04c0-14.336 11.264-25.6 25.6-25.6s25.6 11.264 25.6 25.6v87.04c0 14.336-11.264 25.6-25.6 25.6z" p-id="5476"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
1
src/assets/icons/svg/language.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
1
src/assets/icons/svg/link.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
|
||||||
|
After Width: | Height: | Size: 285 B |
1
src/assets/icons/svg/list.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.585 12.087c0 6.616 3.974 11.98 8.877 11.98 4.902 0 8.877-5.364 8.877-11.98 0-6.616-3.975-11.98-8.877-11.98-4.903 0-8.877 5.364-8.877 11.98zM125.86.107H35.613c-1.268 0-2.114 1.426-2.114 2.852v18.255c0 1.712 1.057 2.853 2.114 2.853h90.247c1.268 0 2.114-1.426 2.114-2.853V2.96c0-1.711-1.057-2.852-2.114-2.852zM.106 62.86c0 6.615 3.974 11.979 8.876 11.979 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zM124.17 50.88H33.921c-1.268 0-2.114 1.425-2.114 2.851v18.256c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852V53.73c0-1.426-.846-2.852-2.114-2.852zM.106 115.913c0 6.616 3.974 11.98 8.876 11.98 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zm124.064-11.98H33.921c-1.268 0-2.114 1.426-2.114 2.853v18.255c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852v-18.255c0-1.427-.846-2.853-2.114-2.853z"/></svg>
|
||||||
|
After Width: | Height: | Size: 1017 B |
9
src/assets/icons/svg/locate-fixed.svg
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16.000000" height="16.000000" fill="none" customFrame="#000000">
|
||||||
|
<rect id="locate-fixed" width="16.000000" height="16.000000" x="0.000000" y="0.000000" />
|
||||||
|
<line id="直线 6" x1="1.33337402" x2="3.33337402" y1="8" y2="8" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<line id="直线 7" x1="12.666626" x2="14.666626" y1="8" y2="8" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<line id="直线 8" x1="0" x2="2" y1="0" y2="0" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" transform="matrix(0,1,-1,0,8,1.33331)" />
|
||||||
|
<line id="直线 9" x1="0" x2="2" y1="0" y2="0" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" transform="matrix(0,1,-1,0,8,12.6667)" />
|
||||||
|
<circle id="椭圆 4" cx="8.00004101" cy="8.00001049" r="4.66666698" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
<circle id="椭圆 5" cx="8" cy="8" r="2" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.333333" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
1
src/assets/icons/svg/lock.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M119.88 49.674h-7.987V39.52C111.893 17.738 90.45.08 63.996.08 37.543.08 16.1 17.738 16.1 39.52v10.154H8.113c-4.408 0-7.987 2.94-7.987 6.577v65.13c0 3.637 3.57 6.577 7.987 6.577H119.88c4.407 0 7.987-2.94 7.987-6.577v-65.13c-.008-3.636-3.58-6.577-7.987-6.577zm-23.953 0H32.065V39.52c0-14.524 14.301-26.295 31.931-26.295 17.63 0 31.932 11.777 31.932 26.295v10.153z"/></svg>
|
||||||
|
After Width: | Height: | Size: 444 B |
1
src/assets/icons/svg/log.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035943711" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4805" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M208.736 566.336H64.384v59.328h144.352v-59.328z m0-336.096H165.44V74.592c0-7.968 4.896-14.848 10.464-14.848h502.016V0.448H175.936c-38.72 1.248-69.248 34.368-68.192 74.144v155.648H64.384V289.6h144.352V230.24z m0 168.096H64.384v59.328h144.352v-59.328z m714.656 76.576h-57.76v474.496c0 7.936-4.896 14.848-10.464 14.848H175.936c-5.568 0-10.464-6.912-10.464-14.848v-155.68h43.296v-59.296H64.384v59.296h43.328v155.68c-1.024 39.776 29.472 72.896 68.192 74.144h679.232c38.72-1.184 69.248-34.368 68.256-74.144V474.912z m14.944-290.336l-83.072-85.312a71.264 71.264 0 0 0-52.544-21.728 71.52 71.52 0 0 0-51.616 23.872L386.528 507.264a30.496 30.496 0 0 0-6.176 10.72L308.16 740.512a30.016 30.016 0 0 0 6.976 30.24c7.712 7.968 19.2 10.752 29.568 7.2l216.544-74.112a28.736 28.736 0 0 0 12.128-7.936L940.448 287.456a75.552 75.552 0 0 0-2.112-102.88z m-557.12 518.272l39.104-120.64 78.336 80.416-117.44 40.224z m170.048-70.016l-103.552-106.016 200.16-222.4 103.52 106.304-200.128 222.112zM897.952 247.072l-0.256 0.224-107.136 119.168-103.52-106.528 106.432-118.624a14.144 14.144 0 0 1 10.304-4.736 13.44 13.44 0 0 1 10.464 4.288l83.264 85.696c5.472 5.6 5.664 14.72 0.448 20.512z" p-id="4806"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
1
src/assets/icons/svg/logininfor.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036016814" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5261" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 128h-85.333333a42.666667 42.666667 0 0 0 0 85.333333h42.666666v640H170.666667V213.333333h42.666666a42.666667 42.666667 0 0 0 0-85.333333H128a42.666667 42.666667 0 0 0-42.666667 42.666667v725.333333a42.666667 42.666667 0 0 0 42.666667 42.666667h768a42.666667 42.666667 0 0 0 42.666667-42.666667V170.666667a42.666667 42.666667 0 0 0-42.666667-42.666667z" p-id="5262"></path><path d="M341.333333 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333333 0v128a42.666667 42.666667 0 0 0 42.666666 42.666667zM512 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333334 0v128a42.666667 42.666667 0 0 0 42.666667 42.666667zM682.666667 298.666667a42.666667 42.666667 0 0 0 42.666666-42.666667V128a42.666667 42.666667 0 0 0-85.333333 0v128a42.666667 42.666667 0 0 0 42.666667 42.666667zM341.333333 768a42.666667 42.666667 0 0 0 42.666667-42.666667 128 128 0 0 1 256 0 42.666667 42.666667 0 0 0 85.333333 0 213.333333 213.333333 0 0 0-107.52-184.32A128 128 0 0 0 640 469.333333a128 128 0 0 0-256 0 128 128 0 0 0 22.186667 71.68A213.333333 213.333333 0 0 0 298.666667 725.333333a42.666667 42.666667 0 0 0 42.666666 42.666667z m128-298.666667a42.666667 42.666667 0 1 1 42.666667 42.666667 42.666667 42.666667 0 0 1-42.666667-42.666667z" p-id="5263"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
6
src/assets/icons/svg/map.svg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<svg viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="18.000000" height="18.000000" fill="none" customFrame="#000000">
|
||||||
|
<rect id="map" width="18.000000" height="18.000000" x="0.000000" y="0.000000" />
|
||||||
|
<path id="矢量 20" d="M11.25 4.32296C11.4827 4.32296 11.7123 4.2688 11.9205 4.16476L14.6648 2.79226C14.7792 2.73508 14.9063 2.70812 15.0341 2.71394C15.1619 2.71976 15.2861 2.75817 15.3948 2.82551C15.5036 2.89285 15.5933 2.9869 15.6555 3.0987C15.7177 3.2105 15.7502 3.33634 15.75 3.46426L15.75 13.0373C15.7499 13.1765 15.7111 13.313 15.6378 13.4314C15.5646 13.5498 15.4598 13.6455 15.3353 13.7078L11.9205 15.4155C11.7123 15.5195 11.4827 15.5737 11.25 15.5737C11.0173 15.5737 10.7877 15.5195 10.5795 15.4155L7.4205 13.836C7.2123 13.732 6.98275 13.6778 6.75 13.6778C6.51726 13.6778 6.2877 13.732 6.0795 13.836L3.33525 15.2085C3.22077 15.2657 3.09355 15.2927 2.9657 15.2868C2.83785 15.281 2.71362 15.2425 2.60484 15.1751C2.49606 15.1076 2.40635 15.0135 2.34424 14.9016C2.28213 14.7897 2.24969 14.6637 2.25 14.5358L2.25 4.96351C2.25008 4.82427 2.28891 4.68779 2.36217 4.56937C2.43542 4.45095 2.54019 4.35526 2.66475 4.29301L6.0795 2.58526C6.2877 2.48122 6.51726 2.42706 6.75 2.42706C6.98275 2.42706 7.2123 2.48122 7.4205 2.58526L10.5795 4.16476C10.7877 4.2688 11.0173 4.32296 11.25 4.32296Z" fill-rule="nonzero" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.500000" />
|
||||||
|
<path id="矢量 21" d="M11.25 4.323L11.25 15.573" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.500000" />
|
||||||
|
<path id="矢量 22" d="M6.75 2.427L6.75 13.677" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.500000" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
1
src/assets/icons/svg/message.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/></svg>
|
||||||
|
After Width: | Height: | Size: 669 B |
1
src/assets/icons/svg/money.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.122 127.892v-28.68H7.513V87.274h46.609v-12.4H7.513v-12.86h38.003L.099 0h22.6l32.556 45.07c3.617 5.144 6.44 9.611 8.487 13.385 1.788-3.05 4.89-7.779 9.301-14.186L103.93 0h24.01L82.385 62.013h38.34v12.862h-46.41v12.4h46.41v11.937h-46.41v28.68H54.123z"/></svg>
|
||||||
|
After Width: | Height: | Size: 335 B |