diff --git a/package.json b/package.json
index 1aa9f70..b4607bb 100644
--- a/package.json
+++ b/package.json
@@ -48,6 +48,7 @@
"js-beautify": "1.13.0",
"js-cookie": "3.0.1",
"jsencrypt": "3.0.0-rc.1",
+ "jsplumb": "^2.15.6",
"nprogress": "0.2.0",
"quill": "1.3.7",
"screenfull": "5.0.2",
@@ -56,9 +57,14 @@
"vue-count-to": "1.0.13",
"vue-cropper": "0.5.5",
"vue-meta": "2.4.0",
- "vue-router": "3.4.9",
"vuedraggable": "2.24.3",
- "vuex": "3.6.0"
+ "jquery": "^3.5.1",
+ "panzoom": "^9.4.1",
+ "view-design": "^4.5.0-beta.3",
+ "vue-click-outside": "^1.1.0",
+ "vue-contextmenujs": "^1.3.13",
+ "vue-router": "^3.2.0",
+ "vuex": "^3.4.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.6",
@@ -77,7 +83,11 @@
"sass-loader": "10.1.1",
"script-ext-html-webpack-plugin": "2.1.5",
"svg-sprite-loader": "5.1.1",
- "vue-template-compiler": "2.6.12"
+ "vue-template-compiler": "2.6.12",
+ "@vue/cli-plugin-router": "~4.5.0",
+ "@vue/cli-plugin-vuex": "~4.5.0",
+ "less": "^3.0.4",
+ "less-loader": "^5.0.0"
},
"engines": {
"node": ">=8.9",
diff --git a/src/App.vue b/src/App.vue
index 69a3716..6c26ff8 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -25,4 +25,13 @@ export default {
#app .theme-picker {
display: none;
}
+
+#app {
+ font-family: Avenir, Helvetica, Arial, sans-serif;
+ width: 100%;
+ height: 100%;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ color: #2c3e50;
+}
diff --git a/src/api/rule/rule.js b/src/api/rule/rule.js
index 043cccc..efc6173 100644
--- a/src/api/rule/rule.js
+++ b/src/api/rule/rule.js
@@ -12,7 +12,7 @@ export function listRule(query) {
// 查询规则详细
export function getRule(id) {
return request({
- url: '/rule/rule/' + id,
+ url: '/rule/rule/findById/' + id,
method: 'get'
})
}
@@ -35,6 +35,7 @@ export function updateRule(data) {
})
}
+
// 删除规则
export function delRule(id) {
return request({
diff --git a/src/assets/point.png b/src/assets/point.png
new file mode 100644
index 0000000..e7b51c1
Binary files /dev/null and b/src/assets/point.png differ
diff --git a/src/assets/sample.jpg b/src/assets/sample.jpg
new file mode 100644
index 0000000..abd63fa
Binary files /dev/null and b/src/assets/sample.jpg differ
diff --git a/src/assets/svg/10大数据服务.svg b/src/assets/svg/10大数据服务.svg
new file mode 100644
index 0000000..f319937
--- /dev/null
+++ b/src/assets/svg/10大数据服务.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/11个人源服务.svg b/src/assets/svg/11个人源服务.svg
new file mode 100644
index 0000000..2622029
--- /dev/null
+++ b/src/assets/svg/11个人源服务.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/12Python.svg b/src/assets/svg/12Python.svg
new file mode 100644
index 0000000..e31a0b2
--- /dev/null
+++ b/src/assets/svg/12Python.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/13测试报告.svg b/src/assets/svg/13测试报告.svg
new file mode 100644
index 0000000..70a0c1a
--- /dev/null
+++ b/src/assets/svg/13测试报告.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/14描述统计.svg b/src/assets/svg/14描述统计.svg
new file mode 100644
index 0000000..07dfeed
--- /dev/null
+++ b/src/assets/svg/14描述统计.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/15清洗.svg b/src/assets/svg/15清洗.svg
new file mode 100644
index 0000000..b5df0b0
--- /dev/null
+++ b/src/assets/svg/15清洗.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/16连接.svg b/src/assets/svg/16连接.svg
new file mode 100644
index 0000000..4a32b9d
--- /dev/null
+++ b/src/assets/svg/16连接.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/17工作包.svg b/src/assets/svg/17工作包.svg
new file mode 100644
index 0000000..ec9e9f6
--- /dev/null
+++ b/src/assets/svg/17工作包.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/18存储.svg b/src/assets/svg/18存储.svg
new file mode 100644
index 0000000..9b31ace
--- /dev/null
+++ b/src/assets/svg/18存储.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/19导出.svg b/src/assets/svg/19导出.svg
new file mode 100644
index 0000000..678acd6
--- /dev/null
+++ b/src/assets/svg/19导出.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/1开始.svg b/src/assets/svg/1开始.svg
new file mode 100644
index 0000000..11791d5
--- /dev/null
+++ b/src/assets/svg/1开始.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/20执行.svg b/src/assets/svg/20执行.svg
new file mode 100644
index 0000000..f0fb26d
--- /dev/null
+++ b/src/assets/svg/20执行.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/21封装包.svg b/src/assets/svg/21封装包.svg
new file mode 100644
index 0000000..700940b
--- /dev/null
+++ b/src/assets/svg/21封装包.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/2结束.svg b/src/assets/svg/2结束.svg
new file mode 100644
index 0000000..bccba30
--- /dev/null
+++ b/src/assets/svg/2结束.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/3横向分割.svg b/src/assets/svg/3横向分割.svg
new file mode 100644
index 0000000..cbdf1f1
--- /dev/null
+++ b/src/assets/svg/3横向分割.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/4纵向分割.svg b/src/assets/svg/4纵向分割.svg
new file mode 100644
index 0000000..bfa1c2b
--- /dev/null
+++ b/src/assets/svg/4纵向分割.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/5文件数据.svg b/src/assets/svg/5文件数据.svg
new file mode 100644
index 0000000..2234fe1
--- /dev/null
+++ b/src/assets/svg/5文件数据.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/6数据校验.svg b/src/assets/svg/6数据校验.svg
new file mode 100644
index 0000000..d42b74e
--- /dev/null
+++ b/src/assets/svg/6数据校验.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/7单键查询.svg b/src/assets/svg/7单键查询.svg
new file mode 100644
index 0000000..7f75c76
--- /dev/null
+++ b/src/assets/svg/7单键查询.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/8个人服务.svg b/src/assets/svg/8个人服务.svg
new file mode 100644
index 0000000..1a9bb4b
--- /dev/null
+++ b/src/assets/svg/8个人服务.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/9外部服务.svg b/src/assets/svg/9外部服务.svg
new file mode 100644
index 0000000..41541c3
--- /dev/null
+++ b/src/assets/svg/9外部服务.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/侧边栏notebook.svg b/src/assets/svg/侧边栏notebook.svg
new file mode 100644
index 0000000..a4ce183
--- /dev/null
+++ b/src/assets/svg/侧边栏notebook.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/侧边栏数据分析.svg b/src/assets/svg/侧边栏数据分析.svg
new file mode 100644
index 0000000..0b109d1
--- /dev/null
+++ b/src/assets/svg/侧边栏数据分析.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/侧边栏数据集.svg b/src/assets/svg/侧边栏数据集.svg
new file mode 100644
index 0000000..c048ad2
--- /dev/null
+++ b/src/assets/svg/侧边栏数据集.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/侧边栏模型跑批.svg b/src/assets/svg/侧边栏模型跑批.svg
new file mode 100644
index 0000000..34f7231
--- /dev/null
+++ b/src/assets/svg/侧边栏模型跑批.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/svg/侧边栏测试任务.svg b/src/assets/svg/侧边栏测试任务.svg
new file mode 100644
index 0000000..d56c6a3
--- /dev/null
+++ b/src/assets/svg/侧边栏测试任务.svg
@@ -0,0 +1 @@
+
diff --git a/src/assets/wx.jpg b/src/assets/wx.jpg
new file mode 100644
index 0000000..4c9d875
Binary files /dev/null and b/src/assets/wx.jpg differ
diff --git a/src/assets/wxqrcode.jpg b/src/assets/wxqrcode.jpg
new file mode 100644
index 0000000..1b8d954
Binary files /dev/null and b/src/assets/wxqrcode.jpg differ
diff --git a/src/common/until.js b/src/common/until.js
new file mode 100644
index 0000000..6a67a84
--- /dev/null
+++ b/src/common/until.js
@@ -0,0 +1,8 @@
+//生成指定长度的唯一ID
+export function GenNonDuplicateID(randomLength) {
+ return Number(
+ Math.random()
+ .toString()
+ .substr(3, randomLength) + Date.now()
+ ).toString(36);
+}
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 94d5d3f..93aea23 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -52,13 +52,17 @@
通知
-
+
阅读
@@ -156,7 +160,7 @@ import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
-import { findNoticeByNoticeId, findNoticeByNoticeIdAndUserId, listNoticeByUserId } from '../../api/system/notice'
+import { findNoticeByNoticeId, findNoticeByNoticeIdAndUserId, listNoticeByUserId } from '@/api/system/notice'
export default {
data() {
diff --git a/src/main.js b/src/main.js
index 5d094ba..b264e8e 100644
--- a/src/main.js
+++ b/src/main.js
@@ -2,6 +2,9 @@ import Vue from 'vue'
import Cookies from 'js-cookie'
+import Contextmenu from 'vue-contextmenujs'
+import ViewUI from 'view-design';
+
import Element from 'element-ui'
import './assets/styles/element-variables.scss'
@@ -58,6 +61,8 @@ Vue.component('FileUpload', FileUpload)
Vue.component('ImageUpload', ImageUpload)
Vue.component('ImagePreview', ImagePreview)
+Vue.use(Contextmenu);
+Vue.use(ViewUI);
Vue.use(directive)
Vue.use(plugins)
Vue.use(VueMeta)
@@ -83,4 +88,4 @@ new Vue({
router,
store,
render: h => h(App)
-})
+}).$mount('#app')
diff --git a/src/utils/request.js b/src/utils/request.js
index e8b4d67..c6a2b80 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -73,7 +73,7 @@ service.interceptors.request.use(config => {
// 响应拦截器
service.interceptors.response.use(res => {
- debugger
+
// 未设置状态码则默认成功状态
const code = res.data.code || 200;
// 获取错误信息
diff --git a/src/views/components/icons/element-icons.js b/src/views/components/icons/element-icons.js
deleted file mode 100644
index 9ea4d63..0000000
--- a/src/views/components/icons/element-icons.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const elementIcons = ['platform-eleme', 'eleme', 'delete-solid', 'delete', 's-tools', 'setting', 'user-solid', 'user', 'phone', 'phone-outline', 'more', 'more-outline', 'star-on', 'star-off', 's-goods', 'goods', 'warning', 'warning-outline', 'question', 'info', 'remove', 'circle-plus', 'success', 'error', 'zoom-in', 'zoom-out', 'remove-outline', 'circle-plus-outline', 'circle-check', 'circle-close', 's-help', 'help', 'minus', 'plus', 'check', 'close', 'picture', 'picture-outline', 'picture-outline-round', 'upload', 'upload2', 'download', 'camera-solid', 'camera', 'video-camera-solid', 'video-camera', 'message-solid', 'bell', 's-cooperation', 's-order', 's-platform', 's-fold', 's-unfold', 's-operation', 's-promotion', 's-home', 's-release', 's-ticket', 's-management', 's-open', 's-shop', 's-marketing', 's-flag', 's-comment', 's-finance', 's-claim', 's-custom', 's-opportunity', 's-data', 's-check', 's-grid', 'menu', 'share', 'd-caret', 'caret-left', 'caret-right', 'caret-bottom', 'caret-top', 'bottom-left', 'bottom-right', 'back', 'right', 'bottom', 'top', 'top-left', 'top-right', 'arrow-left', 'arrow-right', 'arrow-down', 'arrow-up', 'd-arrow-left', 'd-arrow-right', 'video-pause', 'video-play', 'refresh', 'refresh-right', 'refresh-left', 'finished', 'sort', 'sort-up', 'sort-down', 'rank', 'loading', 'view', 'c-scale-to-original', 'date', 'edit', 'edit-outline', 'folder', 'folder-opened', 'folder-add', 'folder-remove', 'folder-delete', 'folder-checked', 'tickets', 'document-remove', 'document-delete', 'document-copy', 'document-checked', 'document', 'document-add', 'printer', 'paperclip', 'takeaway-box', 'search', 'monitor', 'attract', 'mobile', 'scissors', 'umbrella', 'headset', 'brush', 'mouse', 'coordinate', 'magic-stick', 'reading', 'data-line', 'data-board', 'pie-chart', 'data-analysis', 'collection-tag', 'film', 'suitcase', 'suitcase-1', 'receiving', 'collection', 'files', 'notebook-1', 'notebook-2', 'toilet-paper', 'office-building', 'school', 'table-lamp', 'house', 'no-smoking', 'smoking', 'shopping-cart-full', 'shopping-cart-1', 'shopping-cart-2', 'shopping-bag-1', 'shopping-bag-2', 'sold-out', 'sell', 'present', 'box', 'bank-card', 'money', 'coin', 'wallet', 'discount', 'price-tag', 'news', 'guide', 'male', 'female', 'thumb', 'cpu', 'link', 'connection', 'open', 'turn-off', 'set-up', 'chat-round', 'chat-line-round', 'chat-square', 'chat-dot-round', 'chat-dot-square', 'chat-line-square', 'message', 'postcard', 'position', 'turn-off-microphone', 'microphone', 'close-notification', 'bangzhu', 'time', 'odometer', 'crop', 'aim', 'switch-button', 'full-screen', 'copy-document', 'mic', 'stopwatch', 'medal-1', 'medal', 'trophy', 'trophy-1', 'first-aid-kit', 'discover', 'place', 'location', 'location-outline', 'location-information', 'add-location', 'delete-location', 'map-location', 'alarm-clock', 'timer', 'watch-1', 'watch', 'lock', 'unlock', 'key', 'service', 'mobile-phone', 'bicycle', 'truck', 'ship', 'basketball', 'football', 'soccer', 'baseball', 'wind-power', 'light-rain', 'lightning', 'heavy-rain', 'sunrise', 'sunrise-1', 'sunset', 'sunny', 'cloudy', 'partly-cloudy', 'cloudy-and-sunny', 'moon', 'moon-night', 'dish', 'dish-1', 'food', 'chicken', 'fork-spoon', 'knife-fork', 'burger', 'tableware', 'sugar', 'dessert', 'ice-cream', 'hot-water', 'water-cup', 'coffee-cup', 'cold-drink', 'goblet', 'goblet-full', 'goblet-square', 'goblet-square-full', 'refrigerator', 'grape', 'watermelon', 'cherry', 'apple', 'pear', 'orange', 'coffee', 'ice-tea', 'ice-drink', 'milk-tea', 'potato-strips', 'lollipop', 'ice-cream-square', 'ice-cream-round']
-
-export default elementIcons
diff --git a/src/views/components/icons/index.vue b/src/views/components/icons/index.vue
deleted file mode 100644
index 8215c98..0000000
--- a/src/views/components/icons/index.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
-
-
-
- {{ generateIconCode(item) }}
-
-
-
- {{ item }}
-
-
-
-
-
-
-
-
- {{ generateElementIconCode(item) }}
-
-
-
- {{ item }}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/components/icons/svg-icons.js b/src/views/components/icons/svg-icons.js
deleted file mode 100644
index 724cd8e..0000000
--- a/src/views/components/icons/svg-icons.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const req = require.context('../../../assets/icons/svg', false, /\.svg$/)
-const requireAll = requireContext => requireContext.keys()
-
-const re = /\.\/(.*)\.svg/
-
-const svgIcons = requireAll(req).map(i => {
- return i.match(re)[1]
-})
-
-export default svgIcons
diff --git a/src/views/quest/node/Home.vue b/src/views/quest/node/Home.vue
new file mode 100644
index 0000000..0fae5e9
--- /dev/null
+++ b/src/views/quest/node/Home.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
+
![]()
+
+
{{item.typeName}}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/quest/node/components/node-item.vue b/src/views/quest/node/components/node-item.vue
new file mode 100644
index 0000000..4f283b2
--- /dev/null
+++ b/src/views/quest/node/components/node-item.vue
@@ -0,0 +1,195 @@
+
+
+
+
![]()
+
+
{{node.nodeName}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/quest/node/config/commonConfig.js b/src/views/quest/node/config/commonConfig.js
new file mode 100644
index 0000000..01bff20
--- /dev/null
+++ b/src/views/quest/node/config/commonConfig.js
@@ -0,0 +1,89 @@
+export const jsplumbSetting = {
+ grid: [10, 10],
+ // 动态锚点、位置自适应
+ Anchors: [
+ "TopCenter",
+ "RightMiddle",
+ "BottomCenter",
+ "LeftMiddle"
+ ],
+ Container: "flow",
+ // 连线的样式 StateMachine、Flowchart,有四种默认类型:Bezier(贝塞尔曲线),Straight(直线),Flowchart(流程图),State machine(状态机)
+ Connector: ["Flowchart", { cornerRadius: 5, alwaysRespectStubs: true, stub: 5 }],
+ // 鼠标不能拖动删除线
+ ConnectionsDetachable: false,
+ // 删除线的时候节点不删除
+ DeleteEndpointsOnDetach: false,
+ // 连线的端点
+ // Endpoint: ["Dot", {radius: 5}],
+ Endpoint: [
+ "Rectangle",
+ {
+ height: 10,
+ width: 10
+ }
+ ],
+ // 线端点的样式
+ EndpointStyle: {
+ fill: "rgba(255,255,255,0)",
+ outlineWidth: 1
+ },
+ LogEnabled: false, //是否打开jsPlumb的内部日志记录
+ // 绘制线
+ PaintStyle: {
+ stroke: "#409eff",
+ strokeWidth: 2
+ },
+ HoverPaintStyle: { stroke: "#ff00cc", strokeWidth: 2 },
+ // 绘制箭头
+ Overlays: [
+ [
+ "Arrow",
+ {
+ width: 8,
+ length: 8,
+ location: 1
+ }
+ ]
+ ],
+ RenderMode: "svg"
+}
+
+// jsplumb连接参数
+export const jsplumbConnectOptions = {
+ isSource: true,
+ isTarget: true,
+ // 动态锚点、提供了4个方向 Continuous、AutoDefault
+ anchor: [
+ "TopCenter",
+ "RightMiddle",
+ "BottomCenter",
+ "LeftMiddle"
+ ]
+}
+
+export const jsplumbSourceOptions = {
+ filter: ".node-anchor", //触发连线的区域
+ /*"span"表示标签,".className"表示类,"#id"表示元素id*/
+ filterExclude: false,
+ anchor: [
+ "TopCenter",
+ "RightMiddle",
+ "BottomCenter",
+ "LeftMiddle"
+ ],
+ allowLoopback: false
+}
+
+export const jsplumbTargetOptions = {
+ filter: ".node-anchor",
+ /*"span"表示标签,".className"表示类,"#id"表示元素id*/
+ filterExclude: false,
+ anchor: [
+ "TopCenter",
+ "RightMiddle",
+ "BottomCenter",
+ "LeftMiddle"
+ ],
+ allowLoopback: false
+}
diff --git a/src/views/quest/node/config/data.json b/src/views/quest/node/config/data.json
new file mode 100644
index 0000000..4c1618c
--- /dev/null
+++ b/src/views/quest/node/config/data.json
@@ -0,0 +1,4 @@
+{
+ "nodeList": [{"type":"start","typeName":"开始","nodeName":"开始","id":"34v56ha2l9c000","top":"160px","left":"100px"},{"type":"dataSet","typeName":"文件","nodeName":"文件","id":"5sdjugrcqhc000","top":"160px","left":"315px"},{"type":"encode","typeName":"加密","nodeName":"加密","id":"3atqi5p6oa4000","top":"80px","left":"600px"},{"type":"personService","typeName":"个人服务","nodeName":"个人服务","id":"49vcu89p5q0000","top":"245px","left":"600px"},{"type":"arrange","typeName":"清洗","nodeName":"清洗","id":"1jhiilb0t2tc00","top":"180px","left":"880px"},{"type":"end","typeName":"结束","nodeName":"结束","id":"1ogr3wzy6zhc00","top":"180px","left":"1160px"}],
+ "lineList": [{"from":"34v56ha2l9c000","to":"5sdjugrcqhc000","label":"连线名称","id":"5n6pp5xqd6s000","Remark":""},{"from":"5sdjugrcqhc000","to":"3atqi5p6oa4000","label":"连线名称","id":"2a0ya9j1kev400","Remark":""},{"from":"5sdjugrcqhc000","to":"49vcu89p5q0000","label":"连线名称","id":"zoisvo5gpvk00","Remark":""},{"from":"3atqi5p6oa4000","to":"1jhiilb0t2tc00","label":"连线名称","id":"4xkb3dju1g0000","Remark":""},{"from":"49vcu89p5q0000","to":"1jhiilb0t2tc00","label":"连线名称","id":"ldc917l47w000","Remark":""},{"from":"1jhiilb0t2tc00","to":"1ogr3wzy6zhc00","label":"连线名称","id":"478galw3u34000","Remark":""}]
+}
diff --git a/src/views/quest/node/config/init.js b/src/views/quest/node/config/init.js
new file mode 100644
index 0000000..a6acd91
--- /dev/null
+++ b/src/views/quest/node/config/init.js
@@ -0,0 +1,41 @@
+const nodeTypeList = [{
+ type: 'start',
+ typeName: '开始',
+ nodeName: '开始',
+ logImg: require('@/assets/svg/1开始.svg'),
+ log_bg_color: 'rgba(0, 128, 0, 0.2)'
+},{
+ type: 'end',
+ typeName: '结束',
+ nodeName: '结束',
+ logImg: require('@/assets/svg/2结束.svg'),
+ log_bg_color: 'rgba(255, 0, 0, 0.2)'
+},{
+ type: 'dataSet',
+ typeName: '文件',
+ nodeName: '文件',
+ logImg: require('@/assets/svg/5文件数据.svg'),
+ log_bg_color: 'rgba(0, 128, 0, 0.2)'
+},{
+ type: 'encode',
+ typeName: '加密',
+ nodeName: '加密',
+ logImg: require('@/assets/svg/6数据校验.svg'),
+ log_bg_color: 'rgba(163, 117, 233, 0.2)'
+},{
+ type: 'personService',
+ typeName: '个人服务',
+ nodeName: '个人服务',
+ logImg: require('@/assets/svg/8个人服务.svg'),
+ log_bg_color: 'rgba(132, 166, 251, 0.2)'
+},{
+ type: 'arrange',
+ typeName: '清洗',
+ nodeName: '清洗',
+ logImg: require('@/assets/svg/15清洗.svg'),
+ log_bg_color: 'rgba(250, 205, 81, 0.2)'
+}]
+
+console.log(nodeTypeList)
+
+export {nodeTypeList};
diff --git a/src/views/quest/node/config/methods.js b/src/views/quest/node/config/methods.js
new file mode 100644
index 0000000..786c0a9
--- /dev/null
+++ b/src/views/quest/node/config/methods.js
@@ -0,0 +1,316 @@
+import panzoom from "panzoom";
+import { GenNonDuplicateID } from "@/common/until";
+
+const methods = {
+ init() {
+ this.jsPlumb.ready(() => {
+ // 导入默认配置
+ this.jsPlumb.importDefaults(this.jsplumbSetting);
+ //完成连线前的校验
+ this.jsPlumb.bind("beforeDrop", evt => {
+ let res = () => { } //此处可以添加是否创建连接的校验, 返回 false 则不添加;
+ return res
+ })
+ // 连线创建成功后,维护本地数据
+ this.jsPlumb.bind("connection", evt => {
+ this.addLine(evt)
+ });
+ //连线双击删除事件
+ this.jsPlumb.bind("dblclick",(conn, originalEvent) => {
+ this.confirmDelLine(conn)
+ })
+ //断开连线后,维护本地数据
+ this.jsPlumb.bind("connectionDetached", evt => {
+ this.deleLine(evt)
+ })
+ this.loadEasyFlow();
+ // 会使整个jsPlumb立即重绘。
+ this.jsPlumb.setSuspendDrawing(false, true);
+ });
+ this.initPanZoom();
+ },
+ // 加载流程图
+ loadEasyFlow() {
+ // 初始化节点
+ for (let i = 0; i < this.data.nodeList.length; i++) {
+ let node = this.data.nodeList[i];
+ // 设置源点,可以拖出线连接其他节点
+ this.jsPlumb.makeSource(node.id, this.jsplumbSourceOptions);
+ // // 设置目标点,其他源点拖出的线可以连接该节点
+ this.jsPlumb.makeTarget(node.id, this.jsplumbTargetOptions);
+ // this.jsPlumb.draggable(node.id);
+ this.draggableNode(node.id)
+ }
+
+ // 初始化连线
+ this.jsPlumb.unbind("connection"); //取消连接事件
+ for (let i = 0; i < this.data.lineList.length; i++) {
+ let line = this.data.lineList[i];
+ this.jsPlumb.connect(
+ {
+ source: line.from,
+ target: line.to
+ },
+ this.jsplumbConnectOptions
+ );
+ }
+ this.jsPlumb.bind("connection", evt => {
+ let from = evt.source.id;
+ let to = evt.target.id;
+ this.data.lineList.push({
+ from: from,
+ to: to,
+ label: "连线名称",
+ id: GenNonDuplicateID(8),
+ Remark: ""
+ });
+ });
+ },
+ draggableNode(nodeId) {
+ this.jsPlumb.draggable(nodeId, {
+ grid: this.commonGrid,
+ drag: (params) => {
+ this.alignForLine(nodeId, params.pos)
+ },
+ start: () => {
+
+ },
+ stop: (params) => {
+ this.auxiliaryLine.isShowXLine = false
+ this.auxiliaryLine.isShowYLine = false
+ this.changeNodePosition(nodeId, params.pos)
+ }
+ })
+ },
+ //移动节点时,动态显示对齐线
+ alignForLine(nodeId, position) {
+ let showXLine = false, showYLine = false
+ this.data.nodeList.some(el => {
+ if(el.id !== nodeId && el.left == position[0]+'px') {
+ this.auxiliaryLinePos.x = position[0] + 60;
+ showYLine = true
+ }
+ if(el.id !== nodeId && el.top == position[1]+'px') {
+ this.auxiliaryLinePos.y = position[1] + 20;
+ showXLine = true
+ }
+ })
+ this.auxiliaryLine.isShowYLine = showYLine
+ this.auxiliaryLine.isShowXLine = showXLine
+ },
+ changeNodePosition(nodeId, pos) {
+ this.data.nodeList.some(v => {
+ if(nodeId == v.id) {
+ v.left = pos[0] +'px'
+ v.top = pos[1] + 'px'
+ return true
+ }else {
+ return false
+ }
+ })
+ },
+ drag(ele, item) {
+ this.currentItem = item;
+ },
+ drop(event) {
+ const containerRect = this.jsPlumb.getContainer().getBoundingClientRect();
+ const scale = this.getScale();
+ let left = (event.pageX - containerRect.left -60) / scale;
+ let top = (event.pageY - containerRect.top -20) / scale;
+
+ var temp = {
+ ...this.currentItem,
+ id: GenNonDuplicateID(8),
+ top: (Math.round(top/20))*20 + "px",
+ left: (Math.round(left/20))*20 + "px"
+ };
+ this.addNode(temp);
+ },
+ addLine(line) {
+ let from = line.source.id;
+ let to = line.target.id;
+ this.data.lineList.push({
+ from: from,
+ to: to,
+ label: "连线名称",
+ id: GenNonDuplicateID(8),
+ Remark: ""
+ });
+ },
+ confirmDelLine(line) {
+ this.$Modal.confirm({
+ title: '删除连线',
+ content: "确认删除该连线?
",
+ onOk: () => {
+ this.jsPlumb.deleteConnection(line)
+ }
+ })
+ },
+ deleLine(line) {
+ this.data.lineList.forEach((item, index) => {
+ if(item.from === line.sourceId && item.to === line.targetId) {
+ this.data.lineList.splice(index, 1)
+ }
+ })
+ },
+ // dragover默认事件就是不触发drag事件,取消默认事件后,才会触发drag事件
+ allowDrop(event) {
+ event.preventDefault();
+ },
+ getScale() {
+ let scale1;
+ if (this.jsPlumb.pan) {
+ const { scale } = this.jsPlumb.pan.getTransform();
+ scale1 = scale;
+ } else {
+ const matrix = window.getComputedStyle(this.jsPlumb.getContainer()).transform;
+ scale1 = matrix.split(", ")[3] * 1;
+ }
+ this.jsPlumb.setZoom(scale1);
+ return scale1;
+ },
+ // 添加新的节点
+ addNode(temp) {
+ this.data.nodeList.push(temp);
+ this.$nextTick(() => {
+ this.jsPlumb.makeSource(temp.id, this.jsplumbSourceOptions);
+ this.jsPlumb.makeTarget(temp.id, this.jsplumbTargetOptions);
+ this.draggableNode(temp.id)
+ });
+ },
+
+ initPanZoom() {
+ const mainContainer = this.jsPlumb.getContainer();
+ const mainContainerWrap = mainContainer.parentNode;
+ const pan = panzoom(mainContainer, {
+ smoothScroll: false,
+ bounds: true,
+ // autocenter: true,
+ zoomDoubleClickSpeed: 1,
+ minZoom: 0.5,
+ maxZoom: 2,
+ //设置滚动缩放的组合键,默认不需要组合键
+ beforeWheel: (e) => {
+ console.log(e)
+ // let shouldIgnore = !e.ctrlKey
+ // return shouldIgnore
+ },
+ beforeMouseDown: function(e) {
+ // allow mouse-down panning only if altKey is down. Otherwise - ignore
+ var shouldIgnore = e.ctrlKey;
+ return shouldIgnore;
+ }
+ });
+ this.jsPlumb.mainContainerWrap = mainContainerWrap;
+ this.jsPlumb.pan = pan;
+ // 缩放时设置jsPlumb的缩放比率
+ pan.on("zoom", e => {
+ const { x, y, scale } = e.getTransform();
+ this.jsPlumb.setZoom(scale);
+ //根据缩放比例,缩放对齐辅助线长度和位置
+ this.auxiliaryLinePos.width = (1/scale) * 100 + '%'
+ this.auxiliaryLinePos.height = (1/scale) * 100 + '%'
+ this.auxiliaryLinePos.offsetX = -(x/scale)
+ this.auxiliaryLinePos.offsetY = -(y/scale)
+ });
+ pan.on("panend", (e) => {
+ const {x, y, scale} = e.getTransform();
+ this.auxiliaryLinePos.width = (1/scale) * 100 + '%'
+ this.auxiliaryLinePos.height = (1/scale) * 100 + '%'
+ this.auxiliaryLinePos.offsetX = -(x/scale)
+ this.auxiliaryLinePos.offsetY = -(y/scale)
+ })
+
+ // 平移时设置鼠标样式
+ mainContainerWrap.style.cursor = "grab";
+ mainContainerWrap.addEventListener("mousedown", function wrapMousedown() {
+ this.style.cursor = "grabbing";
+ mainContainerWrap.addEventListener("mouseout", function wrapMouseout() {
+ this.style.cursor = "grab";
+ });
+ });
+ mainContainerWrap.addEventListener("mouseup", function wrapMouseup() {
+ this.style.cursor = "grab";
+ });
+ },
+
+ setNodeName(nodeId, name) {
+ this.data.nodeList.some((v) => {
+ if(v.id === nodeId) {
+ v.nodeName = name
+ return true
+ }else {
+ return false
+ }
+ })
+ },
+
+ //删除节点
+ deleteNode(node) {
+ this.data.nodeList.some((v,index) => {
+ if(v.id === node.id) {
+ this.data.nodeList.splice(index, 1)
+ this.jsPlumb.remove(v.id)
+ return true
+ }else {
+ return false
+ }
+ })
+ },
+
+ //更改连线状态
+ changeLineState(nodeId, val) {
+ console.log(val)
+ let lines = this.jsPlumb.getAllConnections()
+ lines.forEach(line => {
+ if(line.targetId === nodeId || line.sourceId === nodeId) {
+ if(val) {
+ line.canvas.classList.add('active')
+ }else {
+ line.canvas.classList.remove('active')
+ }
+ }
+ })
+ },
+
+ //初始化节点位置 (以便对齐,居中)
+ fixNodesPosition() {
+ if(this.data.nodeList && this.$refs.flowWrap) {
+ const nodeWidth = 120
+ const nodeHeight = 40
+ let wrapInfo = this.$refs.flowWrap.getBoundingClientRect()
+ let maxLeft = 0, minLeft = wrapInfo.width, maxTop = 0, minTop = wrapInfo.height;
+ let nodePoint = {
+ left: 0,
+ right: 0,
+ top: 0,
+ bottom: 0
+ }
+ let fixTop = 0, fixLeft = 0;
+ this.data.nodeList.forEach(el => {
+ let top = Number(el.top.substring(0, el.top.length -2))
+ let left = Number(el.left.substring(0, el.left.length -2))
+ maxLeft = left > maxLeft ? left : maxLeft
+ minLeft = left < minLeft ? left : minLeft
+ maxTop = top > maxTop ? top : maxTop
+ minTop = top < minTop ? top : minTop
+ })
+ nodePoint.left = minLeft
+ nodePoint.right = wrapInfo.width - maxLeft - nodeWidth
+ nodePoint.top = minTop
+ nodePoint.bottom = wrapInfo.height - maxTop - nodeHeight;
+
+ fixTop = nodePoint.top !== nodePoint.bottom ? (nodePoint.bottom - nodePoint.top) / 2 : 0;
+ fixLeft = nodePoint.left !== nodePoint.right ? (nodePoint.right - nodePoint.left) / 2 : 0;
+
+ this.data.nodeList.map(el => {
+ let top = Number(el.top.substring(0, el.top.length - 2)) + fixTop;
+ let left = Number(el.left.substring(0, el.left.length - 2)) + fixLeft;
+ el.top = (Math.round(top/20))* 20 + 'px'
+ el.left = (Math.round(left/20))*20 + 'px'
+ })
+ }
+ },
+}
+
+export default methods;
diff --git a/src/views/quest/node/index.vue b/src/views/quest/node/index.vue
deleted file mode 100644
index 0386e16..0000000
--- a/src/views/quest/node/index.vue
+++ /dev/null
@@ -1,308 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- 搜索
- 重置
-
-
-
-
-
- 新增
-
-
- 修改
-
-
- 删除
-
-
- 导出
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 修改
- 删除
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{dict.label}}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/quest/task/index.vue b/src/views/quest/task/index.vue
index e307390..7ece66e 100644
--- a/src/views/quest/task/index.vue
+++ b/src/views/quest/task/index.vue
@@ -149,7 +149,7 @@