diff --git a/acs/nladmin-ui/public/config.js b/acs/nladmin-ui/public/config.js
new file mode 100644
index 0000000..c4d32ea
--- /dev/null
+++ b/acs/nladmin-ui/public/config.js
@@ -0,0 +1,10 @@
+window.g = {
+ dev: {
+ VUE_APP_BASE_API: 'http://127.0.0.1:8010'
+ },
+ prod: {
+ VUE_APP_BASE_API: 'http://127.0.0.1:8010'
+
+ }
+
+}
diff --git a/acs/nladmin-ui/public/favicon.ico b/acs/nladmin-ui/public/favicon.ico
new file mode 100644
index 0000000..fcb6999
Binary files /dev/null and b/acs/nladmin-ui/public/favicon.ico differ
diff --git a/acs/nladmin-ui/public/index.html b/acs/nladmin-ui/public/index.html
new file mode 100644
index 0000000..fb5ee79
--- /dev/null
+++ b/acs/nladmin-ui/public/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+ <%= webpackConfig.name %>
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/App.vue b/acs/nladmin-ui/src/App.vue
new file mode 100644
index 0000000..de8127d
--- /dev/null
+++ b/acs/nladmin-ui/src/App.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/api/acs/Address.js b/acs/nladmin-ui/src/api/acs/Address.js
new file mode 100644
index 0000000..381c96c
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/Address.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/Address',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/Address/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/Address',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/acs/config/deviceAssigned.js b/acs/nladmin-ui/src/api/acs/config/deviceAssigned.js
new file mode 100644
index 0000000..10c9f0b
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/config/deviceAssigned.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/deviceAssigned',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/deviceAssigned/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/deviceAssigned',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/acs/device/acsDeviceErpmapping.js b/acs/nladmin-ui/src/api/acs/device/acsDeviceErpmapping.js
new file mode 100644
index 0000000..49ca0cd
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/device/acsDeviceErpmapping.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/acsDeviceErpmapping',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/acsDeviceErpmapping/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/acsDeviceErpmapping',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/acs/device/device.js b/acs/nladmin-ui/src/api/acs/device/device.js
new file mode 100644
index 0000000..85dd735
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/device/device.js
@@ -0,0 +1,162 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/device',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/device/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/device',
+ method: 'put',
+ data
+ })
+}
+
+export function selectDeviceList() {
+ return request({
+ url: 'api/device/selectList',
+ method: 'get'
+ })
+}
+
+export function selectConDeviceList() {
+ return request({
+ url: 'api/device/selectConveyorList',
+ method: 'get'
+ })
+}
+
+export function selectDeviceListByRegion(region) {
+ return request({
+ url: 'api/device/region/' + region,
+ method: 'get'
+ })
+}
+
+export function selectDeviceListOne() {
+ return request({
+ url: 'api/device/selectListOne',
+ method: 'get'
+ })
+}
+export function selectDeviceListTwo() {
+ return request({
+ url: 'api/device/selectListTwo',
+ method: 'get'
+ })
+}
+export function selectDeviceListThree() {
+ return request({
+ url: 'api/device/selectListThree',
+ method: 'get'
+ })
+}
+
+export function selectDeviceDevicerInfo(status) {
+ return request({
+ url: 'api/device/selectDeviceDevicerInfo/' + status,
+ method: 'get'
+ })
+}
+
+export function changeDeviceStatus(data) {
+ return request({
+ url: 'api/device/changeDeviceStatus',
+ method: 'post',
+ data
+ })
+}
+
+export function saveBarcode(data) {
+ return request({
+ url: 'api/device/updateBarcode',
+ method: 'post',
+ data
+ })
+}
+
+export function callAgv(data) {
+ return request({
+ url: 'api/device/callAgv',
+ method: 'post',
+ data
+ })
+}
+
+export function addMaterial(data) {
+ return request({
+ url: 'api/device/addMaterial',
+ method: 'post',
+ data
+ })
+}
+
+export function responseAgv(data) {
+ return request({
+ url: 'api/device/responseAgv',
+ method: 'post',
+ data
+ })
+}
+
+export function autoCreateTask(data) {
+ return request({
+ url: 'api/device/autoCreateTask',
+ method: 'post',
+ data
+ })
+}
+
+export function cleanTask(data) {
+ return request({
+ url: 'api/device/cleanTask',
+ method: 'post',
+ data
+ })
+}
+
+export function cleanMaterial(data) {
+ return request({
+ url: 'api/device/cleanMaterial',
+ method: 'post',
+ data
+ })
+}
+
+export function queryStorageExtra(storage_code) {
+ return request({
+ url: 'api/device/queryStorageExtra/' + storage_code,
+ method: 'get'
+ })
+}
+
+export function reload() {
+ return request({
+ url: 'api/device/reload',
+ method: 'get'
+ })
+}
+
+export function excelImport(data) {
+ return request({
+ url: 'api/device/excelImport',
+ method: 'post',
+ data
+ })
+}
+
+export default { add, edit, del, selectDeviceList, selectDeviceListByRegion, callAgv, responseAgv, selectDeviceDevicerInfo, autoCreateTask,
+ changeDeviceStatus, cleanTask, queryStorageExtra, selectConDeviceList, saveBarcode, selectDeviceListOne, selectDeviceListTwo, selectDeviceListThree,
+ addMaterial, cleanMaterial, reload, excelImport }
diff --git a/acs/nladmin-ui/src/api/acs/device/deviceDbitem.js b/acs/nladmin-ui/src/api/acs/device/deviceDbitem.js
new file mode 100644
index 0000000..e8ef45c
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/device/deviceDbitem.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/deviceDbitem',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ const data = {
+ id: 1,
+ name2: '张三',
+ info: {
+ id: 999,
+ str: 'str111'
+ }
+ }
+ return request({
+ url: 'api/deviceDbitem/getUserJson',
+ method: 'get',
+ data: data
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/deviceDbitem',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/acs/device/deviceStageMonitor.js b/acs/nladmin-ui/src/api/acs/device/deviceStageMonitor.js
new file mode 100644
index 0000000..00d7228
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/device/deviceStageMonitor.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function getDeviceByCodes(data) { // 获取舞台上设备信息
+ return request({
+ url: 'api/deviceInfo/getDeviceByCodes',
+ method: 'post',
+ data: data
+ })
+}
diff --git a/acs/nladmin-ui/src/api/acs/device/driverConfig.js b/acs/nladmin-ui/src/api/acs/device/driverConfig.js
new file mode 100644
index 0000000..79b2b5d
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/device/driverConfig.js
@@ -0,0 +1,89 @@
+import request from '@/utils/request'
+
+export function get(device_code) {
+ return request({
+ url: 'api/device/' + device_code,
+ method: 'get'
+ })
+}
+
+export function queryDriverConfig(device_id, driver_code) {
+ const data = {
+ device_id: device_id,
+ driver_code: driver_code
+ }
+ return request({
+ url: 'api/device/driverConfig',
+ data,
+ method: 'post'
+ })
+}
+
+export function selectDriverCodeList(device_code) {
+ return request({
+ url: 'api/device/selectDriverCodeList/' + device_code,
+ method: 'get'
+ })
+}
+
+export function updateConfig(parentForm, form, data1, data2) {
+ const data = {
+ parentForm,
+ form,
+ data1,
+ data2
+ }
+ return request({
+ url: 'api/device/updateConfig',
+ data,
+ method: 'post'
+ })
+}
+
+export function testRead(dbItems, opc_id) {
+ const data = {
+ dbItems: dbItems,
+ opc_id: opc_id
+ }
+ return request({
+ url: 'api/device/testRead',
+ method: 'post',
+ data
+ })
+}
+
+export function testwrite(dbItems, opc_id) {
+ const data = {
+ dbItems: dbItems,
+ opc_id: opc_id
+ }
+ return request({
+ url: 'api/device/testWrite',
+ method: 'post',
+ data
+ })
+}
+
+export function queryDBInfoByDriverCode(driverCode) {
+ return request({
+ url: 'api/device/queryDBInfoByDriverCode/' + driverCode,
+ method: 'get'
+ })
+}
+
+export function downloadProtocolConfig(data) {
+ return request({
+ url: 'api/device/downloadProtocolConfig',
+ method: 'post',
+ data,
+ responseType: 'blob'
+ })
+}
+
+export function getAllDriverCodeList() {
+ return request({
+ url: 'api/device/getAllDriverCodeList',
+ method: 'get'
+ })
+}
+
diff --git a/acs/nladmin-ui/src/api/acs/device/opc.js b/acs/nladmin-ui/src/api/acs/device/opc.js
new file mode 100644
index 0000000..0d9de64
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/device/opc.js
@@ -0,0 +1,66 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/opc',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/opc/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function selectOpcList() {
+ return request({
+ url: 'api/opc/selectList',
+ method: 'get'
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/opc',
+ method: 'put',
+ data
+ })
+}
+
+export function getmeteal(data) {
+ return request({
+ url: 'api/opc/getmeteal',
+ method: 'post',
+ data
+ })
+}
+
+export function addPLC(data) {
+ return request({
+ url: 'api/opc/addPLC',
+ method: 'post',
+ data
+ })
+}
+
+export function editPLC(data) {
+ return request({
+ url: 'api/opc/editPLC',
+ method: 'post',
+ data
+ })
+}
+
+export function delPLC(data) {
+ return request({
+ url: 'api/opc/delPLC',
+ method: 'post',
+ data
+ })
+}
+
+export default { add, edit, del, selectOpcList, getmeteal, addPLC, delPLC, editPLC }
diff --git a/acs/nladmin-ui/src/api/acs/device/opcPlc.js b/acs/nladmin-ui/src/api/acs/device/opcPlc.js
new file mode 100644
index 0000000..b083e26
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/device/opcPlc.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/opcPlc',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/opcPlc/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/opcPlc',
+ method: 'put',
+ data
+ })
+}
+
+export function selectPlcList() {
+ return request({
+ url: 'api/opcPlc/selectList',
+ method: 'get'
+ })
+}
+
+export function selectListByOpcID(opc_uuid) {
+ return request({
+ url: 'api/opcPlc/selectList/' + opc_uuid,
+ method: 'get'
+ })
+}
+
+export default { add, edit, del, selectPlcList, selectListByOpcID }
diff --git a/acs/nladmin-ui/src/api/acs/device/storageCell.js b/acs/nladmin-ui/src/api/acs/device/storageCell.js
new file mode 100644
index 0000000..99d0c46
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/device/storageCell.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/storageCell',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/storageCell/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/storageCell',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/acs/instruction/instruction.js b/acs/nladmin-ui/src/api/acs/instruction/instruction.js
new file mode 100644
index 0000000..df0cda5
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/instruction/instruction.js
@@ -0,0 +1,81 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/instruction',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/instruction/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/instruction',
+ method: 'put',
+ data
+ })
+}
+
+export function finish(instruction_id) {
+ return request({
+ url: 'api/instruction/finish/' + instruction_id,
+ method: 'post',
+ data: instruction_id
+ })
+}
+
+export function cancel(instruction_id) {
+ return request({
+ url: 'api/instruction/cancel/' + instruction_id,
+ method: 'post',
+ data: instruction_id
+ })
+}
+
+export function forceCancel(instruction_id) {
+ return request({
+ url: 'api/instruction/forceCancel/' + instruction_id,
+ method: 'post',
+ data: instruction_id
+ })
+}
+
+export function queryUnFinish() {
+ return request({
+ url: 'api/instruction/unfinish/',
+ method: 'get'
+ })
+}
+
+export function queryByTaskId(task_id) {
+ return request({
+ url: 'api/instruction/queryByTaskId/' + task_id,
+ method: 'post',
+ data: task_id
+ })
+}
+
+export function reload() {
+ return request({
+ url: 'api/instruction/reload',
+ method: 'get'
+ })
+}
+
+export function init(instruction_id) {
+ return request({
+ url: 'api/instruction/init/' + instruction_id,
+ method: 'post',
+ data: instruction_id
+ })
+}
+
+export default { add, edit, del, finish, cancel, forceCancel, queryUnFinish, queryByTaskId, reload, init }
diff --git a/acs/nladmin-ui/src/api/acs/lucene/log.js b/acs/nladmin-ui/src/api/acs/lucene/log.js
new file mode 100644
index 0000000..0b7ef0a
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/lucene/log.js
@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+export function delAll(id) {
+ return request({
+ url: 'api/lucene/' + id,
+ method: 'delete'
+ })
+}
+
+export default { delAll }
diff --git a/acs/nladmin-ui/src/api/acs/route/routeLine.js b/acs/nladmin-ui/src/api/acs/route/routeLine.js
new file mode 100644
index 0000000..78fe275
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/route/routeLine.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/routeLine',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/routeLine/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/routeLine',
+ method: 'put',
+ data
+ })
+} export function enabled(data) {
+ return request({
+ url: 'api/routeLine/enabled',
+ method: 'put',
+ data
+ })
+}
+
+export function reload() {
+ return request({
+ url: 'api/routeLine/reload',
+ method: 'get'
+ })
+}
+
+export default { add, edit, del, enabled, reload }
diff --git a/acs/nladmin-ui/src/api/acs/route/routeLoc.js b/acs/nladmin-ui/src/api/acs/route/routeLoc.js
new file mode 100644
index 0000000..4a5ca87
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/route/routeLoc.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/routeLoc',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/routeLoc/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/routeLoc',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/acs/route/routePlan.js b/acs/nladmin-ui/src/api/acs/route/routePlan.js
new file mode 100644
index 0000000..43ee1d6
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/route/routePlan.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/routePlan',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/routePlan/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/routePlan',
+ method: 'put',
+ data
+ })
+}
+
+export function selectList() {
+ return request({
+ url: 'api/routePlan/selectList',
+ method: 'get'
+ })
+}
+export function getRoute(device_code, next_device_code, route_plan_code) {
+ return request({
+ url: '/api/routeLine/getShortPathLines?device_code=' + device_code + '&next_device_code=' + next_device_code + '&route_plan_code=' + route_plan_code,
+ method: 'post'
+ })
+}
+
+export default { add, edit, del, selectList, getRoute }
diff --git a/acs/nladmin-ui/src/api/acs/stage/actor.js b/acs/nladmin-ui/src/api/acs/stage/actor.js
new file mode 100644
index 0000000..bf0d14a
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/stage/actor.js
@@ -0,0 +1,42 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/stageActor',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/stageActor/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/stageActor',
+ method: 'put',
+ data
+ })
+}
+
+export function saveData(data) {
+ return request({
+ url: 'api/stageActor/saveData',
+ method: 'post',
+ data
+ })
+}
+
+export function queryStageActor(stage_code) {
+ return request({
+ url: 'api/stageActor/queryStageActor/' + stage_code,
+ method: 'get'
+ })
+}
+
+export default { add, edit, del, saveData, queryStageActor }
diff --git a/acs/nladmin-ui/src/api/acs/stage/stage.js b/acs/nladmin-ui/src/api/acs/stage/stage.js
new file mode 100644
index 0000000..2cb059e
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/stage/stage.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/stage',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/stage/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/stage',
+ method: 'put',
+ data
+ })
+}
+
+export function selectStageList() {
+ return request({
+ url: 'api/stage/selectList',
+ method: 'get'
+ })
+}
+
+export default { add, edit, del,selectStageList }
diff --git a/acs/nladmin-ui/src/api/acs/stage/stageImage.js b/acs/nladmin-ui/src/api/acs/stage/stageImage.js
new file mode 100644
index 0000000..2dfb67b
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/stage/stageImage.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/stageImage',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/stageImage/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/stageImage',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/acs/task/task.js b/acs/nladmin-ui/src/api/acs/task/task.js
new file mode 100644
index 0000000..8c3e7e0
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/task/task.js
@@ -0,0 +1,99 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/task',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/task/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/task',
+ method: 'put',
+ data
+ })
+}
+
+export function finish(task_id) {
+ return request({
+ url: 'api/task/finish/' + task_id,
+ method: 'post',
+ data: task_id
+ })
+}
+
+export function cancel(task_id) {
+ return request({
+ url: 'api/task/cancel/' + task_id,
+ method: 'post',
+ data: task_id
+ })
+}
+
+export function createInst(task_id) {
+ return request({
+ url: 'api/task/createInst/' + task_id,
+ method: 'post',
+ data: task_id
+ })
+}
+
+export function createTaskByClick(data) {
+ return request({
+ url: 'api/task/createTaskByClick',
+ method: 'post',
+ data
+ })
+}
+
+export function queryTaskTreeRecord(data) {
+ return request({
+ url: 'api/task/queryTaskTreeRecord',
+ method: 'post',
+ data
+ })
+}
+
+export function deviceAskTask(data) {
+ return request({
+ url: 'api/task/deviceAskTask',
+ method: 'post',
+ data
+ })
+}
+
+export function ordinaryTaskCreate(data) {
+ return request({
+ url: 'api/task/adds',
+ method: 'post',
+ data
+ })
+}
+
+export function specialTaskCreate(data) {
+ return request({
+ url: 'api/task/addes',
+ method: 'post',
+ data
+ })
+}
+
+export function reload() {
+ return request({
+ url: 'api/task/reload',
+ method: 'get'
+ })
+}
+
+export default { add, edit, del, finish, cancel, createTaskByClick, deviceAskTask, ordinaryTaskCreate, specialTaskCreate, createInst, reload }
+
diff --git a/acs/nladmin-ui/src/api/acs/task/taskFeedback.js b/acs/nladmin-ui/src/api/acs/task/taskFeedback.js
new file mode 100644
index 0000000..f87924e
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/task/taskFeedback.js
@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+export function retry(task_id) {
+ return request({
+ url: 'api/taskFeedback/retry/' + task_id,
+ method: 'post',
+ data: task_id
+ })
+}
+
+export function invalid(task_id) {
+ return request({
+ url: 'api/taskFeedback/invalid/' + task_id,
+ method: 'post',
+ data: task_id
+ })
+}
+
+export default { retry, invalid }
diff --git a/acs/nladmin-ui/src/api/acs/test/test.js b/acs/nladmin-ui/src/api/acs/test/test.js
new file mode 100644
index 0000000..d975297
--- /dev/null
+++ b/acs/nladmin-ui/src/api/acs/test/test.js
@@ -0,0 +1,55 @@
+import request from '@/utils/request'
+
+export function test1() {
+ return request({
+ url: 'api/test/test1',
+ method: 'post'
+ })
+}
+
+export function test2() {
+ return request({
+ url: 'api/test/test2',
+ method: 'post'
+ })
+}
+
+export function test3() {
+ return request({
+ url: 'api/test/test3',
+ method: 'post'
+ })
+}
+
+export function test4(data) {
+ return request({
+ url: 'api/test/test4',
+ method: 'post',
+ data
+ })
+}
+
+export function test5() {
+ return request({
+ url: 'api/test/test5',
+ method: 'post'
+ })
+}
+
+export function test6(data) {
+ return request({
+ url: 'api/test/test6',
+ method: 'post',
+ data
+ })
+}
+
+export function print() {
+ return request({
+ url: 'api/test/print',
+ method: 'post'
+ })
+}
+
+export default { test1, test2, test3, test4, test5, test6, print }
+
diff --git a/acs/nladmin-ui/src/api/data.js b/acs/nladmin-ui/src/api/data.js
new file mode 100644
index 0000000..989cb23
--- /dev/null
+++ b/acs/nladmin-ui/src/api/data.js
@@ -0,0 +1,21 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+export function initData(url, params) {
+ if (params.createTime) {
+ params.begin_time = params.createTime[0]
+ params.end_time = params.createTime[1]
+ }
+ return request({
+ url: url + '?' + qs.stringify(params, { indices: false }),
+ method: 'get'
+ })
+}
+
+export function download(url, params) {
+ return request({
+ url: url + '?' + qs.stringify(params, { indices: false }),
+ method: 'get',
+ responseType: 'blob'
+ })
+}
diff --git a/acs/nladmin-ui/src/api/generator/genConfig.js b/acs/nladmin-ui/src/api/generator/genConfig.js
new file mode 100644
index 0000000..e15b200
--- /dev/null
+++ b/acs/nladmin-ui/src/api/generator/genConfig.js
@@ -0,0 +1,16 @@
+import request from '@/utils/request'
+
+export function get(tableName) {
+ return request({
+ url: 'api/genConfig/' + tableName,
+ method: 'get'
+ })
+}
+
+export function update(data) {
+ return request({
+ url: 'api/genConfig',
+ data,
+ method: 'put'
+ })
+}
diff --git a/acs/nladmin-ui/src/api/generator/generator.js b/acs/nladmin-ui/src/api/generator/generator.js
new file mode 100644
index 0000000..0c49718
--- /dev/null
+++ b/acs/nladmin-ui/src/api/generator/generator.js
@@ -0,0 +1,33 @@
+import request from '@/utils/request'
+
+export function getAllTable() {
+ return request({
+ url: 'api/generator/tables/all',
+ method: 'get'
+ })
+}
+
+export function generator(tableName, type) {
+ return request({
+ url: 'api/generator/' + tableName + '/' + type,
+ method: 'post',
+ responseType: type === 2 ? 'blob' : ''
+ })
+}
+
+export function save(data) {
+ return request({
+ url: 'api/generator',
+ data,
+ method: 'put'
+ })
+}
+
+export function sync(tables) {
+ return request({
+ url: 'api/generator/sync',
+ method: 'post',
+ data: tables
+ })
+}
+
diff --git a/acs/nladmin-ui/src/api/logicflow/stage.js b/acs/nladmin-ui/src/api/logicflow/stage.js
new file mode 100644
index 0000000..7c6c955
--- /dev/null
+++ b/acs/nladmin-ui/src/api/logicflow/stage.js
@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/stage',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/stage/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/stage',
+ method: 'put',
+ data
+ })
+}
+
+export function selectStageList() {
+ return request({
+ url: 'api/stage/selectList',
+ method: 'get'
+ })
+}
+
+export function addNewStage(data) { // 保存舞台数据
+ return request({
+ url: 'api/stage/addNewStage',
+ method: 'post',
+ data
+ })
+}
+
+export function getNewStageDataByCode(code) {
+ return request({
+ url: 'api/stage/getNewStageDataByCode',
+ method: 'post',
+ data: code
+ })
+}
+
+export default { add, edit, del, selectStageList, addNewStage, getNewStageDataByCode }
diff --git a/acs/nladmin-ui/src/api/logicflow/stageImage.js b/acs/nladmin-ui/src/api/logicflow/stageImage.js
new file mode 100644
index 0000000..20b902d
--- /dev/null
+++ b/acs/nladmin-ui/src/api/logicflow/stageImage.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/stageImage',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/stageImage/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/stageImage',
+ method: 'put',
+ data
+ })
+}
+
+export function selectStageIconList() {
+ return request({
+ url: 'api/stageImage/selectList',
+ method: 'get'
+ })
+}
+
+export default { add, edit, del, selectStageIconList }
diff --git a/acs/nladmin-ui/src/api/login.js b/acs/nladmin-ui/src/api/login.js
new file mode 100644
index 0000000..413c0a8
--- /dev/null
+++ b/acs/nladmin-ui/src/api/login.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+export function login(username, password, code, uuid) {
+ // debugger
+ return request({
+ url: 'auth/login',
+ method: 'post',
+ data: {
+ username,
+ password,
+ code,
+ uuid
+ }
+ })
+}
+
+export function getInfo() {
+ return request({
+ url: 'auth/info',
+ method: 'get'
+ })
+}
+
+export function getCodeImg() {
+ return request({
+ url: 'auth/code',
+ method: 'get'
+ })
+}
+
+export function logout() {
+ return request({
+ url: 'auth/logout',
+ method: 'delete'
+ })
+}
diff --git a/acs/nladmin-ui/src/api/monitor/log.js b/acs/nladmin-ui/src/api/monitor/log.js
new file mode 100644
index 0000000..13f0d39
--- /dev/null
+++ b/acs/nladmin-ui/src/api/monitor/log.js
@@ -0,0 +1,22 @@
+import request from '@/utils/request'
+
+export function getErrDetail(id) {
+ return request({
+ url: 'api/logs/error/' + id,
+ method: 'get'
+ })
+}
+
+export function delAllError() {
+ return request({
+ url: 'api/logs/del/error',
+ method: 'delete'
+ })
+}
+
+export function delAllInfo() {
+ return request({
+ url: 'api/logs/del/info',
+ method: 'delete'
+ })
+}
diff --git a/acs/nladmin-ui/src/api/monitor/online.js b/acs/nladmin-ui/src/api/monitor/online.js
new file mode 100644
index 0000000..057275b
--- /dev/null
+++ b/acs/nladmin-ui/src/api/monitor/online.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function del(keys) {
+ return request({
+ url: 'auth/online',
+ method: 'delete',
+ data: keys
+ })
+}
diff --git a/acs/nladmin-ui/src/api/system/autorun.js b/acs/nladmin-ui/src/api/system/autorun.js
new file mode 100644
index 0000000..399a7ba
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/autorun.js
@@ -0,0 +1,22 @@
+import request from '@/utils/request'
+
+export function getAll() {
+ return request({
+ url: 'api/autorun',
+ method: 'get'
+ })
+}
+
+export function start(id) {
+ return request({
+ url: 'api/autorun/start/' + id,
+ method: 'put'
+ })
+} export function stop(id) {
+ return request({
+ url: 'api/autorun/stop/' + id,
+ method: 'put'
+ })
+}
+
+export default { start, stop }
diff --git a/acs/nladmin-ui/src/api/system/code.js b/acs/nladmin-ui/src/api/system/code.js
new file mode 100644
index 0000000..0d2e4c2
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/code.js
@@ -0,0 +1,15 @@
+import request from '@/utils/request'
+
+export function resetEmail(data) {
+ return request({
+ url: 'api/code/resetEmail?email=' + data,
+ method: 'post'
+ })
+}
+
+export function updatePass(pass) {
+ return request({
+ url: 'api/users/updatePass/' + pass,
+ method: 'get'
+ })
+}
diff --git a/acs/nladmin-ui/src/api/system/dept.js b/acs/nladmin-ui/src/api/system/dept.js
new file mode 100644
index 0000000..ed4f944
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/dept.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+export function getDepts(params) {
+ return request({
+ url: 'api/dept',
+ method: 'get',
+ params
+ })
+}
+
+export function getDeptSuperior(ids) {
+ const data = ids.length || ids.length === 0 ? ids : Array.of(ids)
+ return request({
+ url: 'api/dept/superior',
+ method: 'post',
+ data
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/dept',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/dept',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/dept',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del, getDepts, getDeptSuperior }
diff --git a/acs/nladmin-ui/src/api/system/dict.js b/acs/nladmin-ui/src/api/system/dict.js
new file mode 100644
index 0000000..99170f7
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/dict.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+export function getDicts() {
+ return request({
+ url: 'api/dict/all',
+ method: 'get'
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/dict',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/dict/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/dict',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/system/dictDetail.js b/acs/nladmin-ui/src/api/system/dictDetail.js
new file mode 100644
index 0000000..e8dc512
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/dictDetail.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+export function get(dictName) {
+ const params = {
+ dictName,
+ page: 0,
+ size: 9999
+ }
+ return request({
+ url: 'api/dictDetail',
+ method: 'get',
+ params
+ })
+}
+
+export function getDictMap(dictName) {
+ const params = {
+ dictName,
+ page: 0,
+ size: 9999
+ }
+ return request({
+ url: 'api/dictDetail/map',
+ method: 'get',
+ params
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/dictDetail',
+ method: 'post',
+ data
+ })
+}
+
+export function del(id) {
+ return request({
+ url: 'api/dictDetail/' + id,
+ method: 'delete'
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/dictDetail',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/system/genCode.js b/acs/nladmin-ui/src/api/system/genCode.js
new file mode 100644
index 0000000..416f8e9
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/genCode.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+export function getGenCode() {
+ return request({
+ url: 'api/genCode/all',
+ method: 'get'
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/genCode',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/genCode/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/genCode/',
+ method: 'put',
+ data
+ })
+}
+
+export default {
+ add, del, edit
+}
diff --git a/acs/nladmin-ui/src/api/system/grid.js b/acs/nladmin-ui/src/api/system/grid.js
new file mode 100644
index 0000000..02857d4
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/grid.js
@@ -0,0 +1,33 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/grid',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/grid/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/grid',
+ method: 'put',
+ data
+ })
+}
+export function selectList() {
+ return request({
+ url: 'api/grid/selectList',
+ method: 'get'
+ })
+}
+
+export default { add, edit, del, selectList }
diff --git a/acs/nladmin-ui/src/api/system/gridField.js b/acs/nladmin-ui/src/api/system/gridField.js
new file mode 100644
index 0000000..a207188
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/gridField.js
@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/gridField',
+ method: 'post',
+ data
+ })
+}
+export function batchAdd(json) { // use
+ return request({
+ url: 'api/gridField/batchAdd',
+ method: 'post',
+ data: json
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/gridField/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/gridField',
+ method: 'put',
+ data
+ })
+}
+
+export function getGridFieldsById(id) { // use
+ return request({
+ url: 'api/gridField/getGridFields',
+ method: 'post',
+ data: id
+ })
+}
+
+export function getGridFieldsByCode(grid_code) { // use
+ return request({
+ url: 'api/gridField/getGridFieldsByCode',
+ method: 'post',
+ data: grid_code
+ })
+}
+
+export default { add, edit, del, batchAdd, getGridFieldsById, getGridFieldsByCode }
diff --git a/acs/nladmin-ui/src/api/system/menu.js b/acs/nladmin-ui/src/api/system/menu.js
new file mode 100644
index 0000000..3298543
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/menu.js
@@ -0,0 +1,65 @@
+import request from '@/utils/request'
+
+export function getMenusTree(pid) {
+ return request({
+ url: 'api/menus/lazy?pid=' + pid,
+ method: 'get'
+ })
+}
+
+export function getMenus(params) {
+ return request({
+ url: 'api/menus',
+ method: 'get',
+ params
+ })
+}
+
+export function getMenuSuperior(ids) {
+ const data = ids.length || ids.length === 0 ? ids : Array.of(ids)
+ return request({
+ url: 'api/menus/superior',
+ method: 'post',
+ data
+ })
+}
+
+export function getChild(id) {
+ return request({
+ url: 'api/menus/child?id=' + id,
+ method: 'get'
+ })
+}
+
+export function buildMenus() {
+ return request({
+ url: 'api/menus/build',
+ method: 'get'
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/menus',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/menus',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/menus',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del, getMenusTree, getMenuSuperior, getMenus, getChild }
diff --git a/acs/nladmin-ui/src/api/system/param.js b/acs/nladmin-ui/src/api/system/param.js
new file mode 100644
index 0000000..c2ded22
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/param.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/param',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/param/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/param',
+ method: 'put',
+ data
+ })
+}
+
+export function getValueByCode(code) {
+ return request({
+ url: 'api/param/getValueByCode',
+ method: 'post',
+ data: code
+ })
+}
+
+export default { add, edit, del, getValueByCode }
diff --git a/acs/nladmin-ui/src/api/system/redis.js b/acs/nladmin-ui/src/api/system/redis.js
new file mode 100644
index 0000000..71261ba
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/redis.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+// 查询缓存详细
+export function getCache() {
+ return request({
+ url: '/api/redis/get-monitor-info',
+ method: 'get'
+ })
+}
+
+// 获取模块
+export function getKeyDefineList() {
+ return request({
+ url: '/api/redis/get-key-define-list',
+ method: 'get'
+ })
+}
+
+// 获取模块
+export function getKeyValueList() {
+ return request({
+ url: '/api/redis/get-key-value-list',
+ method: 'get'
+ })
+}
+
+export function batch(ids) {
+ return request({
+ url: 'api/redis/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export default { getCache, getKeyDefineList, batch }
diff --git a/acs/nladmin-ui/src/api/system/role.js b/acs/nladmin-ui/src/api/system/role.js
new file mode 100644
index 0000000..1f7bc1e
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/role.js
@@ -0,0 +1,57 @@
+import request from '@/utils/request'
+
+// 获取所有的Role
+export function getAll() {
+ return request({
+ url: 'api/roles/all',
+ method: 'get'
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/roles',
+ method: 'post',
+ data
+ })
+}
+
+export function get(id) {
+ return request({
+ url: 'api/roles/' + id,
+ method: 'get'
+ })
+}
+
+export function getLevel() {
+ return request({
+ url: 'api/roles/level',
+ method: 'get'
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/roles',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/roles',
+ method: 'put',
+ data
+ })
+}
+
+export function editMenu(data) {
+ return request({
+ url: 'api/roles/menu',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del, get, editMenu, getLevel }
diff --git a/acs/nladmin-ui/src/api/system/timing.js b/acs/nladmin-ui/src/api/system/timing.js
new file mode 100644
index 0000000..613e15f
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/timing.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/jobs',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/jobs',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/jobs',
+ method: 'put',
+ data
+ })
+}
+
+export function updateIsPause(id) {
+ return request({
+ url: 'api/jobs/' + id,
+ method: 'put'
+ })
+}
+
+export function execution(id) {
+ return request({
+ url: 'api/jobs/exec/' + id,
+ method: 'put'
+ })
+}
+
+export default { del, updateIsPause, execution, add, edit }
diff --git a/acs/nladmin-ui/src/api/system/user.js b/acs/nladmin-ui/src/api/system/user.js
new file mode 100644
index 0000000..6cd91a5
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/user.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+import { encrypt } from '@/utils/rsaEncrypt'
+
+export function add(data) {
+ return request({
+ url: 'api/users',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/users',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/users',
+ method: 'put',
+ data
+ })
+}
+
+export function editUser(data) {
+ return request({
+ url: 'api/users/center',
+ method: 'put',
+ data
+ })
+}
+
+export function updatePass(user) {
+ const data = {
+ oldPass: encrypt(user.oldPass),
+ newPass: encrypt(user.newPass)
+ }
+ return request({
+ url: 'api/users/updatePass/',
+ method: 'post',
+ data
+ })
+}
+
+export function updateEmail(form) {
+ const data = {
+ password: encrypt(form.pass),
+ email: form.email
+ }
+ return request({
+ url: 'api/users/updateEmail/' + form.code,
+ method: 'post',
+ data
+ })
+}
+
+export default { add, edit, del }
+
diff --git a/acs/nladmin-ui/src/api/tools/codeDetail.js b/acs/nladmin-ui/src/api/tools/codeDetail.js
new file mode 100644
index 0000000..bc295ab
--- /dev/null
+++ b/acs/nladmin-ui/src/api/tools/codeDetail.js
@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+export function get(dictName) {
+ const params = {
+ dictName,
+ page: 0,
+ size: 9999
+ }
+ return request({
+ url: 'api/codeDetail',
+ method: 'get',
+ params
+ })
+}
+
+export function add(data) {
+ return request({
+ url: 'api/codeDetail',
+ method: 'post',
+ data
+ })
+}
+
+export function del(id) {
+ return request({
+ url: 'api/codeDetail/' + id,
+ method: 'delete'
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/codeDetail',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/tools/localStorage.js b/acs/nladmin-ui/src/api/tools/localStorage.js
new file mode 100644
index 0000000..63ebe2b
--- /dev/null
+++ b/acs/nladmin-ui/src/api/tools/localStorage.js
@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/localStorage',
+ method: 'post',
+ data
+ })
+}
+
+export function del(ids) {
+ return request({
+ url: 'api/localStorage/',
+ method: 'delete',
+ data: ids
+ })
+}
+
+export function edit(data) {
+ return request({
+ url: 'api/localStorage',
+ method: 'put',
+ data
+ })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/assets/401_images/401.gif b/acs/nladmin-ui/src/assets/401_images/401.gif
new file mode 100644
index 0000000..cd6e0d9
Binary files /dev/null and b/acs/nladmin-ui/src/assets/401_images/401.gif differ
diff --git a/acs/nladmin-ui/src/assets/404_images/404.png b/acs/nladmin-ui/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
Binary files /dev/null and b/acs/nladmin-ui/src/assets/404_images/404.png differ
diff --git a/acs/nladmin-ui/src/assets/404_images/404_cloud.png b/acs/nladmin-ui/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
Binary files /dev/null and b/acs/nladmin-ui/src/assets/404_images/404_cloud.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/1.png b/acs/nladmin-ui/src/assets/acs/1.png
new file mode 100644
index 0000000..1ec6a1a
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/AGV.png b/acs/nladmin-ui/src/assets/acs/AGV.png
new file mode 100644
index 0000000..79f880b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/AGV.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/AGV1.png b/acs/nladmin-ui/src/assets/acs/AGV1.png
new file mode 100644
index 0000000..125d830
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/AGV1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/BCR.png b/acs/nladmin-ui/src/assets/acs/BCR.png
new file mode 100644
index 0000000..f5f010f
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/BCR.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/BCR1.png b/acs/nladmin-ui/src/assets/acs/BCR1.png
new file mode 100644
index 0000000..4258b1b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/BCR1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/CPJ.png b/acs/nladmin-ui/src/assets/acs/CPJ.png
new file mode 100644
index 0000000..5735dcf
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/CPJ.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/DDJ.png b/acs/nladmin-ui/src/assets/acs/DDJ.png
new file mode 100644
index 0000000..17c470a
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/DDJ.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/DDJ1.png b/acs/nladmin-ui/src/assets/acs/DDJ1.png
new file mode 100644
index 0000000..8910084
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/DDJ1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/HPJ.png b/acs/nladmin-ui/src/assets/acs/HPJ.png
new file mode 100644
index 0000000..28c0a35
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/HPJ.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/SSJ.png b/acs/nladmin-ui/src/assets/acs/SSJ.png
new file mode 100644
index 0000000..aff6b5b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/SSJ.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/SSJ1.png b/acs/nladmin-ui/src/assets/acs/SSJ1.png
new file mode 100644
index 0000000..6d1009f
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/SSJ1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/del_new.png b/acs/nladmin-ui/src/assets/acs/del_new.png
new file mode 100644
index 0000000..85c9fdc
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/del_new.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/home_agv.png b/acs/nladmin-ui/src/assets/acs/home_agv.png
new file mode 100644
index 0000000..d73781d
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/home_agv.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/icon_alert.png b/acs/nladmin-ui/src/assets/acs/icon_alert.png
new file mode 100644
index 0000000..c224792
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/icon_alert.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/icon_alert2.png b/acs/nladmin-ui/src/assets/acs/icon_alert2.png
new file mode 100644
index 0000000..4498bf5
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/icon_alert2.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/status0.png b/acs/nladmin-ui/src/assets/acs/status0.png
new file mode 100644
index 0000000..7830af7
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/status0.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/status1.png b/acs/nladmin-ui/src/assets/acs/status1.png
new file mode 100644
index 0000000..d0d0a4b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/status1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/undefined.png b/acs/nladmin-ui/src/assets/acs/undefined.png
new file mode 100644
index 0000000..79f880b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/undefined.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/一.png b/acs/nladmin-ui/src/assets/acs/一.png
new file mode 100644
index 0000000..22cb9a3
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/一.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/三.png b/acs/nladmin-ui/src/assets/acs/三.png
new file mode 100644
index 0000000..c4c9033
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/三.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/三通一体机.png b/acs/nladmin-ui/src/assets/acs/三通一体机.png
new file mode 100644
index 0000000..d21399b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/三通一体机.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/下.png b/acs/nladmin-ui/src/assets/acs/下.png
new file mode 100644
index 0000000..bd19330
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/下.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/专机.png b/acs/nladmin-ui/src/assets/acs/专机.png
new file mode 100644
index 0000000..234f4f9
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/专机.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/仓.png b/acs/nladmin-ui/src/assets/acs/仓.png
new file mode 100644
index 0000000..0f268f5
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/仓.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/伸.png b/acs/nladmin-ui/src/assets/acs/伸.png
new file mode 100644
index 0000000..b620106
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/伸.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/体.png b/acs/nladmin-ui/src/assets/acs/体.png
new file mode 100644
index 0000000..b156423
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/体.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/储.png b/acs/nladmin-ui/src/assets/acs/储.png
new file mode 100644
index 0000000..04df2eb
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/储.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/储料仓.png b/acs/nladmin-ui/src/assets/acs/储料仓.png
new file mode 100644
index 0000000..9ebef5b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/储料仓.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/光.png b/acs/nladmin-ui/src/assets/acs/光.png
new file mode 100644
index 0000000..8fe3b12
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/光.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/刻.png b/acs/nladmin-ui/src/assets/acs/刻.png
new file mode 100644
index 0000000..58c035e
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/刻.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/刻字机.png b/acs/nladmin-ui/src/assets/acs/刻字机.png
new file mode 100644
index 0000000..2efb8a9
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/刻字机.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/加.png b/acs/nladmin-ui/src/assets/acs/加.png
new file mode 100644
index 0000000..1313647
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/加.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/包.png b/acs/nladmin-ui/src/assets/acs/包.png
new file mode 100644
index 0000000..4345bbe
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/包.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/包装机1.png b/acs/nladmin-ui/src/assets/acs/包装机1.png
new file mode 100644
index 0000000..7cb6a89
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/包装机1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/包装机2.png b/acs/nladmin-ui/src/assets/acs/包装机2.png
new file mode 100644
index 0000000..5eef3e0
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/包装机2.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/包装机3.png b/acs/nladmin-ui/src/assets/acs/包装机3.png
new file mode 100644
index 0000000..0fe952c
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/包装机3.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/包装机4.png b/acs/nladmin-ui/src/assets/acs/包装机4.png
new file mode 100644
index 0000000..968073d
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/包装机4.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/区.png b/acs/nladmin-ui/src/assets/acs/区.png
new file mode 100644
index 0000000..869eda4
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/区.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/区域横.png b/acs/nladmin-ui/src/assets/acs/区域横.png
new file mode 100644
index 0000000..03f930c
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/区域横.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/区域竖.png b/acs/nladmin-ui/src/assets/acs/区域竖.png
new file mode 100644
index 0000000..25135ac
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/区域竖.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/压.png b/acs/nladmin-ui/src/assets/acs/压.png
new file mode 100644
index 0000000..771154e
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/压.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/叠盘机.png b/acs/nladmin-ui/src/assets/acs/叠盘机.png
new file mode 100644
index 0000000..273ae2c
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/叠盘机.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/品.png b/acs/nladmin-ui/src/assets/acs/品.png
new file mode 100644
index 0000000..9c30f05
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/品.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/墙面横.png b/acs/nladmin-ui/src/assets/acs/墙面横.png
new file mode 100644
index 0000000..53983ae
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/墙面横.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/墙面竖.png b/acs/nladmin-ui/src/assets/acs/墙面竖.png
new file mode 100644
index 0000000..606c486
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/墙面竖.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/孔.png b/acs/nladmin-ui/src/assets/acs/孔.png
new file mode 100644
index 0000000..80ea23e
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/孔.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/字.png b/acs/nladmin-ui/src/assets/acs/字.png
new file mode 100644
index 0000000..028c269
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/字.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/屑.png b/acs/nladmin-ui/src/assets/acs/屑.png
new file mode 100644
index 0000000..516eec7
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/屑.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/工.png b/acs/nladmin-ui/src/assets/acs/工.png
new file mode 100644
index 0000000..d707bf9
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/工.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/常温.png b/acs/nladmin-ui/src/assets/acs/常温.png
new file mode 100644
index 0000000..9278ba2
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/常温.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/常温1.png b/acs/nladmin-ui/src/assets/acs/常温1.png
new file mode 100644
index 0000000..358d41d
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/常温1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/弯.png b/acs/nladmin-ui/src/assets/acs/弯.png
new file mode 100644
index 0000000..9be15ae
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/弯.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/成.png b/acs/nladmin-ui/src/assets/acs/成.png
new file mode 100644
index 0000000..ef38c16
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/成.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/托盘.png b/acs/nladmin-ui/src/assets/acs/托盘.png
new file mode 100644
index 0000000..b19456a
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/托盘.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/拉.png b/acs/nladmin-ui/src/assets/acs/拉.png
new file mode 100644
index 0000000..16065d4
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/拉.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/推.png b/acs/nladmin-ui/src/assets/acs/推.png
new file mode 100644
index 0000000..2f15386
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/推.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/推弯成型1.png b/acs/nladmin-ui/src/assets/acs/推弯成型1.png
new file mode 100644
index 0000000..f08d70d
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/推弯成型1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/推弯成型2.png b/acs/nladmin-ui/src/assets/acs/推弯成型2.png
new file mode 100644
index 0000000..c57183d
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/推弯成型2.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/推弯成型3.png b/acs/nladmin-ui/src/assets/acs/推弯成型3.png
new file mode 100644
index 0000000..116ba7a
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/推弯成型3.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/料.png b/acs/nladmin-ui/src/assets/acs/料.png
new file mode 100644
index 0000000..dbfb82b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/料.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/旋.png b/acs/nladmin-ui/src/assets/acs/旋.png
new file mode 100644
index 0000000..236b38f
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/旋.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/无.png b/acs/nladmin-ui/src/assets/acs/无.png
new file mode 100644
index 0000000..98ca792
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/无.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/机.png b/acs/nladmin-ui/src/assets/acs/机.png
new file mode 100644
index 0000000..79cfdc1
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/机.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/机械手.png b/acs/nladmin-ui/src/assets/acs/机械手.png
new file mode 100644
index 0000000..b0c91b0
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/机械手.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/桶.png b/acs/nladmin-ui/src/assets/acs/桶.png
new file mode 100644
index 0000000..a36d65d
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/桶.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/洗.png b/acs/nladmin-ui/src/assets/acs/洗.png
new file mode 100644
index 0000000..3d659ec
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/洗.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/清.png b/acs/nladmin-ui/src/assets/acs/清.png
new file mode 100644
index 0000000..b7d515f
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/清.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/清洗机1.png b/acs/nladmin-ui/src/assets/acs/清洗机1.png
new file mode 100644
index 0000000..6f85780
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/清洗机1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/清洗机2.png b/acs/nladmin-ui/src/assets/acs/清洗机2.png
new file mode 100644
index 0000000..1bca582
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/清洗机2.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/清洗机3.png b/acs/nladmin-ui/src/assets/acs/清洗机3.png
new file mode 100644
index 0000000..99ed875
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/清洗机3.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/清洗机4.png b/acs/nladmin-ui/src/assets/acs/清洗机4.png
new file mode 100644
index 0000000..f44b4bf
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/清洗机4.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/清洗机5.png b/acs/nladmin-ui/src/assets/acs/清洗机5.png
new file mode 100644
index 0000000..e45c287
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/清洗机5.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/滚筒输送机.png b/acs/nladmin-ui/src/assets/acs/滚筒输送机.png
new file mode 100644
index 0000000..651a2f9
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/滚筒输送机.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/激.png b/acs/nladmin-ui/src/assets/acs/激.png
new file mode 100644
index 0000000..d82ddd9
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/激.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/盘.png b/acs/nladmin-ui/src/assets/acs/盘.png
new file mode 100644
index 0000000..874f2ad
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/盘.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/盘管下料1.png b/acs/nladmin-ui/src/assets/acs/盘管下料1.png
new file mode 100644
index 0000000..1032095
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/盘管下料1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/盘管下料2.png b/acs/nladmin-ui/src/assets/acs/盘管下料2.png
new file mode 100644
index 0000000..08b33f3
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/盘管下料2.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/盘管下料3.png b/acs/nladmin-ui/src/assets/acs/盘管下料3.png
new file mode 100644
index 0000000..44555b1
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/盘管下料3.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/直.png b/acs/nladmin-ui/src/assets/acs/直.png
new file mode 100644
index 0000000..71a63b6
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/直.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/直管下料1.png b/acs/nladmin-ui/src/assets/acs/直管下料1.png
new file mode 100644
index 0000000..38bd280
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/直管下料1.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/直管下料2.png b/acs/nladmin-ui/src/assets/acs/直管下料2.png
new file mode 100644
index 0000000..e99f90c
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/直管下料2.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/直管下料3.png b/acs/nladmin-ui/src/assets/acs/直管下料3.png
new file mode 100644
index 0000000..44555b1
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/直管下料3.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/码.png b/acs/nladmin-ui/src/assets/acs/码.png
new file mode 100644
index 0000000..1d718b4
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/码.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/站点.png b/acs/nladmin-ui/src/assets/acs/站点.png
new file mode 100644
index 0000000..4536767
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/站点.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/管.png b/acs/nladmin-ui/src/assets/acs/管.png
new file mode 100644
index 0000000..05d1797
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/管.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/虚拟点位.png b/acs/nladmin-ui/src/assets/acs/虚拟点位.png
new file mode 100644
index 0000000..19f1c0c
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/虚拟点位.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/装.png b/acs/nladmin-ui/src/assets/acs/装.png
new file mode 100644
index 0000000..27d5c4c
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/装.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/货台.png b/acs/nladmin-ui/src/assets/acs/货台.png
new file mode 100644
index 0000000..7628200
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/货台.png differ
diff --git a/acs/nladmin-ui/src/assets/acs/镗.png b/acs/nladmin-ui/src/assets/acs/镗.png
new file mode 100644
index 0000000..8108275
Binary files /dev/null and b/acs/nladmin-ui/src/assets/acs/镗.png differ
diff --git a/acs/nladmin-ui/src/assets/icons/index.js b/acs/nladmin-ui/src/assets/icons/index.js
new file mode 100644
index 0000000..2c6b309
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/index.js
@@ -0,0 +1,9 @@
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg component
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+const req = require.context('./svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+requireAll(req)
diff --git a/acs/nladmin-ui/src/assets/icons/svg/Steve-Jobs.svg b/acs/nladmin-ui/src/assets/icons/svg/Steve-Jobs.svg
new file mode 100644
index 0000000..53843e2
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/Steve-Jobs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/alipay.svg b/acs/nladmin-ui/src/assets/icons/svg/alipay.svg
new file mode 100644
index 0000000..9138981
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/alipay.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/anq.svg b/acs/nladmin-ui/src/assets/icons/svg/anq.svg
new file mode 100644
index 0000000..a466608
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/anq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/app.svg b/acs/nladmin-ui/src/assets/icons/svg/app.svg
new file mode 100644
index 0000000..0796da3
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/app.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/backup.svg b/acs/nladmin-ui/src/assets/icons/svg/backup.svg
new file mode 100644
index 0000000..a3272a4
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/backup.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/button.svg b/acs/nladmin-ui/src/assets/icons/svg/button.svg
new file mode 100644
index 0000000..904fddc
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/button.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/cascader.svg b/acs/nladmin-ui/src/assets/icons/svg/cascader.svg
new file mode 100644
index 0000000..e256024
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/cascader.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/chain.svg b/acs/nladmin-ui/src/assets/icons/svg/chain.svg
new file mode 100644
index 0000000..ed3317f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/chain.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/chart.svg b/acs/nladmin-ui/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/checkbox.svg b/acs/nladmin-ui/src/assets/icons/svg/checkbox.svg
new file mode 100644
index 0000000..013fd3a
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/checkbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/clear.svg b/acs/nladmin-ui/src/assets/icons/svg/clear.svg
new file mode 100644
index 0000000..add284f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/clear.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/codeConsole.svg b/acs/nladmin-ui/src/assets/icons/svg/codeConsole.svg
new file mode 100644
index 0000000..672ec6e
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/codeConsole.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/color.svg b/acs/nladmin-ui/src/assets/icons/svg/color.svg
new file mode 100644
index 0000000..44a81aa
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/component.svg b/acs/nladmin-ui/src/assets/icons/svg/component.svg
new file mode 100644
index 0000000..29c3458
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/component.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/dashboard.svg b/acs/nladmin-ui/src/assets/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/database.svg b/acs/nladmin-ui/src/assets/icons/svg/database.svg
new file mode 100644
index 0000000..7fbad9b
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/database.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/date-range.svg b/acs/nladmin-ui/src/assets/icons/svg/date-range.svg
new file mode 100644
index 0000000..fda571e
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/date-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/date.svg b/acs/nladmin-ui/src/assets/icons/svg/date.svg
new file mode 100644
index 0000000..0540e99
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/date.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/deploy.svg b/acs/nladmin-ui/src/assets/icons/svg/deploy.svg
new file mode 100644
index 0000000..f4a1c56
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/deploy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/dept.svg b/acs/nladmin-ui/src/assets/icons/svg/dept.svg
new file mode 100644
index 0000000..894e4bf
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/dept.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/dev.svg b/acs/nladmin-ui/src/assets/icons/svg/dev.svg
new file mode 100644
index 0000000..ed4d23c
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/dev.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/develop.svg b/acs/nladmin-ui/src/assets/icons/svg/develop.svg
new file mode 100644
index 0000000..e189223
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/develop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/dictionary.svg b/acs/nladmin-ui/src/assets/icons/svg/dictionary.svg
new file mode 100644
index 0000000..6e83c43
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/dictionary.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/doc.svg b/acs/nladmin-ui/src/assets/icons/svg/doc.svg
new file mode 100644
index 0000000..9160de8
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/doc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/downAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/downAlign.svg
new file mode 100644
index 0000000..d02dce2
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/downAlign.svg
@@ -0,0 +1,2 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/download.svg b/acs/nladmin-ui/src/assets/icons/svg/download.svg
new file mode 100644
index 0000000..0243c6a
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/edit.svg b/acs/nladmin-ui/src/assets/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/education.svg b/acs/nladmin-ui/src/assets/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/email.svg b/acs/nladmin-ui/src/assets/icons/svg/email.svg
new file mode 100644
index 0000000..f1cf3ae
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/error.svg b/acs/nladmin-ui/src/assets/icons/svg/error.svg
new file mode 100644
index 0000000..fd935da
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/exit-fullscreen.svg b/acs/nladmin-ui/src/assets/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/fullscreen.svg b/acs/nladmin-ui/src/assets/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/fwb.svg b/acs/nladmin-ui/src/assets/icons/svg/fwb.svg
new file mode 100644
index 0000000..59933fc
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/fwb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/github.svg b/acs/nladmin-ui/src/assets/icons/svg/github.svg
new file mode 100644
index 0000000..8145e95
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/gonggao.svg b/acs/nladmin-ui/src/assets/icons/svg/gonggao.svg
new file mode 100644
index 0000000..22aed08
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/gonggao.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/horizontalAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/horizontalAlign.svg
new file mode 100644
index 0000000..ed79e1a
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/horizontalAlign.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/horizontalDistribution.svg b/acs/nladmin-ui/src/assets/icons/svg/horizontalDistribution.svg
new file mode 100644
index 0000000..b4af40e
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/horizontalDistribution.svg
@@ -0,0 +1,2 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/icon.svg b/acs/nladmin-ui/src/assets/icons/svg/icon.svg
new file mode 100644
index 0000000..82fbdd9
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/image.svg b/acs/nladmin-ui/src/assets/icons/svg/image.svg
new file mode 100644
index 0000000..16d572f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/image.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/index.svg b/acs/nladmin-ui/src/assets/icons/svg/index.svg
new file mode 100644
index 0000000..fdb3826
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/index.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/input.svg b/acs/nladmin-ui/src/assets/icons/svg/input.svg
new file mode 100644
index 0000000..ab91381
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/input.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/international.svg b/acs/nladmin-ui/src/assets/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/ipvisits.svg b/acs/nladmin-ui/src/assets/icons/svg/ipvisits.svg
new file mode 100644
index 0000000..4ca473d
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/ipvisits.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/java.svg b/acs/nladmin-ui/src/assets/icons/svg/java.svg
new file mode 100644
index 0000000..e2effbb
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/java.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/leftAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/leftAlign.svg
new file mode 100644
index 0000000..b373ac3
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/leftAlign.svg
@@ -0,0 +1,2 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/link.svg b/acs/nladmin-ui/src/assets/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/list.svg b/acs/nladmin-ui/src/assets/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/lock.svg b/acs/nladmin-ui/src/assets/icons/svg/lock.svg
new file mode 100644
index 0000000..0f842ea
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/log.svg b/acs/nladmin-ui/src/assets/icons/svg/log.svg
new file mode 100644
index 0000000..4fefe74
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/log.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/login.svg b/acs/nladmin-ui/src/assets/icons/svg/login.svg
new file mode 100644
index 0000000..cc5a854
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/login.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/markdown.svg b/acs/nladmin-ui/src/assets/icons/svg/markdown.svg
new file mode 100644
index 0000000..7cd6747
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/markdown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/menu.svg b/acs/nladmin-ui/src/assets/icons/svg/menu.svg
new file mode 100644
index 0000000..e4360a0
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/message.svg b/acs/nladmin-ui/src/assets/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/mnt.svg b/acs/nladmin-ui/src/assets/icons/svg/mnt.svg
new file mode 100644
index 0000000..502a7c0
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/mnt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/money.svg b/acs/nladmin-ui/src/assets/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/monitor.svg b/acs/nladmin-ui/src/assets/icons/svg/monitor.svg
new file mode 100644
index 0000000..fbf0a2f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/monitor.svg
@@ -0,0 +1 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/nested.svg b/acs/nladmin-ui/src/assets/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/number.svg b/acs/nladmin-ui/src/assets/icons/svg/number.svg
new file mode 100644
index 0000000..ad5ce9a
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/number.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/password.svg b/acs/nladmin-ui/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..4ab451f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/people.svg b/acs/nladmin-ui/src/assets/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/peoples.svg b/acs/nladmin-ui/src/assets/icons/svg/peoples.svg
new file mode 100644
index 0000000..2c91161
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/permission.svg b/acs/nladmin-ui/src/assets/icons/svg/permission.svg
new file mode 100644
index 0000000..c4c7409
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/permission.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/phone.svg b/acs/nladmin-ui/src/assets/icons/svg/phone.svg
new file mode 100644
index 0000000..da339f9
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/qiniu.svg b/acs/nladmin-ui/src/assets/icons/svg/qiniu.svg
new file mode 100644
index 0000000..c2f9f8b
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/qiniu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/radio.svg b/acs/nladmin-ui/src/assets/icons/svg/radio.svg
new file mode 100644
index 0000000..0cde345
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/radio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/rate.svg b/acs/nladmin-ui/src/assets/icons/svg/rate.svg
new file mode 100644
index 0000000..aa3b14d
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/rate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/redis.svg b/acs/nladmin-ui/src/assets/icons/svg/redis.svg
new file mode 100644
index 0000000..bef111b
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/redis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/rich-text.svg b/acs/nladmin-ui/src/assets/icons/svg/rich-text.svg
new file mode 100644
index 0000000..76c45bf
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/rich-text.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/rightAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/rightAlign.svg
new file mode 100644
index 0000000..b0670ba
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/rightAlign.svg
@@ -0,0 +1,2 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/role.svg b/acs/nladmin-ui/src/assets/icons/svg/role.svg
new file mode 100644
index 0000000..76cb18f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/role.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/row.svg b/acs/nladmin-ui/src/assets/icons/svg/row.svg
new file mode 100644
index 0000000..0780992
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/row.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/save.svg b/acs/nladmin-ui/src/assets/icons/svg/save.svg
new file mode 100644
index 0000000..e9e05e3
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/save.svg
@@ -0,0 +1,2 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/search.svg b/acs/nladmin-ui/src/assets/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/sect.svg b/acs/nladmin-ui/src/assets/icons/svg/sect.svg
new file mode 100644
index 0000000..5da4538
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/sect.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/select.svg b/acs/nladmin-ui/src/assets/icons/svg/select.svg
new file mode 100644
index 0000000..d628382
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/select.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/server.svg b/acs/nladmin-ui/src/assets/icons/svg/server.svg
new file mode 100644
index 0000000..db6dcdf
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/shopping.svg b/acs/nladmin-ui/src/assets/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/size.svg b/acs/nladmin-ui/src/assets/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/skill.svg b/acs/nladmin-ui/src/assets/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/slider.svg b/acs/nladmin-ui/src/assets/icons/svg/slider.svg
new file mode 100644
index 0000000..fbe4f39
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/slider.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/source.svg b/acs/nladmin-ui/src/assets/icons/svg/source.svg
new file mode 100644
index 0000000..1c3a038
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/source.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/sqlMonitor.svg b/acs/nladmin-ui/src/assets/icons/svg/sqlMonitor.svg
new file mode 100644
index 0000000..950a430
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/sqlMonitor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/stor.svg b/acs/nladmin-ui/src/assets/icons/svg/stor.svg
new file mode 100644
index 0000000..8f61519
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/stor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/struct.svg b/acs/nladmin-ui/src/assets/icons/svg/struct.svg
new file mode 100644
index 0000000..0d20d83
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/struct.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/swagger.svg b/acs/nladmin-ui/src/assets/icons/svg/swagger.svg
new file mode 100644
index 0000000..ded7de8
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/swagger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/switch.svg b/acs/nladmin-ui/src/assets/icons/svg/switch.svg
new file mode 100644
index 0000000..0ba61e3
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/switch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/sys-tools.svg b/acs/nladmin-ui/src/assets/icons/svg/sys-tools.svg
new file mode 100644
index 0000000..324aa04
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/sys-tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/system.svg b/acs/nladmin-ui/src/assets/icons/svg/system.svg
new file mode 100644
index 0000000..9333c60
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/system.svg
@@ -0,0 +1 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/system1.svg b/acs/nladmin-ui/src/assets/icons/svg/system1.svg
new file mode 100644
index 0000000..37b0a0a
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/system1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/tab.svg b/acs/nladmin-ui/src/assets/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/table.svg b/acs/nladmin-ui/src/assets/icons/svg/table.svg
new file mode 100644
index 0000000..e806845
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/textarea.svg b/acs/nladmin-ui/src/assets/icons/svg/textarea.svg
new file mode 100644
index 0000000..2709f29
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/textarea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/theme.svg b/acs/nladmin-ui/src/assets/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/time-range.svg b/acs/nladmin-ui/src/assets/icons/svg/time-range.svg
new file mode 100644
index 0000000..13c1202
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/time-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/time.svg b/acs/nladmin-ui/src/assets/icons/svg/time.svg
new file mode 100644
index 0000000..b376e32
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/timing.svg b/acs/nladmin-ui/src/assets/icons/svg/timing.svg
new file mode 100644
index 0000000..f8fdc6d
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/timing.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/tools.svg b/acs/nladmin-ui/src/assets/icons/svg/tools.svg
new file mode 100644
index 0000000..aba1a40
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/tree-table.svg b/acs/nladmin-ui/src/assets/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/tree.svg b/acs/nladmin-ui/src/assets/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/unlock.svg b/acs/nladmin-ui/src/assets/icons/svg/unlock.svg
new file mode 100644
index 0000000..1219e41
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/unlock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/upAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/upAlign.svg
new file mode 100644
index 0000000..29645dd
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/upAlign.svg
@@ -0,0 +1,2 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/upload.svg b/acs/nladmin-ui/src/assets/icons/svg/upload.svg
new file mode 100644
index 0000000..bae49c0
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/upload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/user.svg b/acs/nladmin-ui/src/assets/icons/svg/user.svg
new file mode 100644
index 0000000..09d7a81
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/user1.svg b/acs/nladmin-ui/src/assets/icons/svg/user1.svg
new file mode 100644
index 0000000..14ca51e
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/user1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/validCode.svg b/acs/nladmin-ui/src/assets/icons/svg/validCode.svg
new file mode 100644
index 0000000..a1feb74
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/validCode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/verticalAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/verticalAlign.svg
new file mode 100644
index 0000000..a3646a0
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/verticalAlign.svg
@@ -0,0 +1,2 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/verticalDistribution.svg b/acs/nladmin-ui/src/assets/icons/svg/verticalDistribution.svg
new file mode 100644
index 0000000..e628a9e
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/verticalDistribution.svg
@@ -0,0 +1,2 @@
+
diff --git a/acs/nladmin-ui/src/assets/icons/svg/visits.svg b/acs/nladmin-ui/src/assets/icons/svg/visits.svg
new file mode 100644
index 0000000..8425662
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/visits.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/web.svg b/acs/nladmin-ui/src/assets/icons/svg/web.svg
new file mode 100644
index 0000000..9c57415
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/web.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/wechat.svg b/acs/nladmin-ui/src/assets/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/weixin.svg b/acs/nladmin-ui/src/assets/icons/svg/weixin.svg
new file mode 100644
index 0000000..8dbcfa5
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/weixin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/zidian.svg b/acs/nladmin-ui/src/assets/icons/svg/zidian.svg
new file mode 100644
index 0000000..5cac6f1
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/zidian.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/zujian.svg b/acs/nladmin-ui/src/assets/icons/svg/zujian.svg
new file mode 100644
index 0000000..2aba32f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/zujian.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svgo.yml b/acs/nladmin-ui/src/assets/icons/svgo.yml
new file mode 100644
index 0000000..d11906a
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svgo.yml
@@ -0,0 +1,22 @@
+# replace default config
+
+# multipass: true
+# full: true
+
+plugins:
+
+ # - name
+ #
+ # or:
+ # - name: false
+ # - name: true
+ #
+ # or:
+ # - name:
+ # param1: 1
+ # param2: 2
+
+- removeAttrs:
+ attrs:
+ - 'fill'
+ - 'fill-rule'
diff --git a/acs/nladmin-ui/src/assets/images/avatar.png b/acs/nladmin-ui/src/assets/images/avatar.png
new file mode 100644
index 0000000..786c57b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/avatar.png differ
diff --git a/acs/nladmin-ui/src/assets/images/avatar1.png b/acs/nladmin-ui/src/assets/images/avatar1.png
new file mode 100644
index 0000000..997732a
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/avatar1.png differ
diff --git a/acs/nladmin-ui/src/assets/images/avatar2.png b/acs/nladmin-ui/src/assets/images/avatar2.png
new file mode 100644
index 0000000..a1660d5
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/avatar2.png differ
diff --git a/acs/nladmin-ui/src/assets/images/background.jpg b/acs/nladmin-ui/src/assets/images/background.jpg
new file mode 100644
index 0000000..585e703
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/background.jpg differ
diff --git a/acs/nladmin-ui/src/assets/images/background11.jpg b/acs/nladmin-ui/src/assets/images/background11.jpg
new file mode 100644
index 0000000..471a65c
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/background11.jpg differ
diff --git a/acs/nladmin-ui/src/assets/images/background111.jpg b/acs/nladmin-ui/src/assets/images/background111.jpg
new file mode 100644
index 0000000..529b89a
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/background111.jpg differ
diff --git a/acs/nladmin-ui/src/assets/images/background1111.jpg b/acs/nladmin-ui/src/assets/images/background1111.jpg
new file mode 100644
index 0000000..62d024d
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/background1111.jpg differ
diff --git a/acs/nladmin-ui/src/assets/images/background2.jpg b/acs/nladmin-ui/src/assets/images/background2.jpg
new file mode 100644
index 0000000..69e6348
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/background2.jpg differ
diff --git a/acs/nladmin-ui/src/assets/images/background222.jpg b/acs/nladmin-ui/src/assets/images/background222.jpg
new file mode 100644
index 0000000..e3a2c71
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/background222.jpg differ
diff --git a/acs/nladmin-ui/src/assets/images/background3.jpg b/acs/nladmin-ui/src/assets/images/background3.jpg
new file mode 100644
index 0000000..5424ccd
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/background3.jpg differ
diff --git a/acs/nladmin-ui/src/assets/images/dark.svg b/acs/nladmin-ui/src/assets/images/dark.svg
new file mode 100644
index 0000000..fffb76c
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/images/dark.svg
@@ -0,0 +1,39 @@
+
+
diff --git a/acs/nladmin-ui/src/assets/images/light.svg b/acs/nladmin-ui/src/assets/images/light.svg
new file mode 100644
index 0000000..ab7cc08
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/images/light.svg
@@ -0,0 +1,39 @@
+
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/images/login-background.jpg b/acs/nladmin-ui/src/assets/images/login-background.jpg
new file mode 100644
index 0000000..8a89eb8
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/login-background.jpg differ
diff --git a/acs/nladmin-ui/src/assets/images/logo.png b/acs/nladmin-ui/src/assets/images/logo.png
new file mode 100644
index 0000000..f757710
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/logo.png differ
diff --git a/acs/nladmin-ui/src/assets/images/profile.jpg b/acs/nladmin-ui/src/assets/images/profile.jpg
new file mode 100644
index 0000000..b3a940b
Binary files /dev/null and b/acs/nladmin-ui/src/assets/images/profile.jpg differ
diff --git a/acs/nladmin-ui/src/assets/js/lodop/CLodop_Setup_for_Win32NT.exe b/acs/nladmin-ui/src/assets/js/lodop/CLodop_Setup_for_Win32NT.exe
new file mode 100644
index 0000000..6d936ac
Binary files /dev/null and b/acs/nladmin-ui/src/assets/js/lodop/CLodop_Setup_for_Win32NT.exe differ
diff --git a/acs/nladmin-ui/src/assets/js/lodop/LodopFuncs.js b/acs/nladmin-ui/src/assets/js/lodop/LodopFuncs.js
new file mode 100644
index 0000000..796702b
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/js/lodop/LodopFuncs.js
@@ -0,0 +1,49 @@
+import { MessageBox } from 'element-ui'
+
+// ====页面动态加载C-Lodop云打印必须的文件CLodopfuncs.js====
+var head = document.head || document.getElementsByTagName('head')[0] || document.documentElement
+var oscript = document.createElement('script')
+// 让本机的浏览器打印(更优先一点):
+oscript = document.createElement('script')
+oscript.src = 'http://localhost:8000/CLodopfuncs.js?priority=2'
+head.insertBefore(oscript, head.firstChild)
+// 加载双端口(8000和18000)避免其中某个端口被占用:
+oscript = document.createElement('script')
+oscript.src = 'http://localhost:18000/CLodopfuncs.js?priority=1'
+head.insertBefore(oscript, head.firstChild)
+
+// 下载loadLodop
+function loadLodop() {
+ window.open('./CLodop_Setup_for_Win32NT.exe')
+}
+
+// ====获取LODOP对象的主过程:====
+function getLodop() {
+ var LODOP
+ try {
+ LODOP = getCLodop()
+ if (!LODOP && document.readyState !== 'complete') {
+ MessageBox.alert('C-Lodop打印控件还没准备好,请稍后再试!')
+ return
+ }
+ //设置打印版权
+ LODOP.SET_LICENSES('浙江省烟草专卖局(公司)', 'C0C4A46A3A0D1F526D426018D9F11921', '', '')
+ LODOP.SET_SHOW_MODE('SETUP_ENABLESS', '10000000000000')
+ return LODOP
+ } catch (err) {
+ MessageBox({
+ title: '温馨提示',
+ type: 'warning',
+ showCancelButton: true,
+ message: '您还未安装打印控件,点击确定下载打印控件,安装成功后刷新页面即可进行打印',
+ callback: res => {
+ if (res === 'confirm') {
+ loadLodop()
+ }
+ }
+ })
+ }
+}
+
+export { getLodop }
+
diff --git a/acs/nladmin-ui/src/assets/js/lodop/install_lodop32.exe b/acs/nladmin-ui/src/assets/js/lodop/install_lodop32.exe
new file mode 100644
index 0000000..7c52f25
Binary files /dev/null and b/acs/nladmin-ui/src/assets/js/lodop/install_lodop32.exe differ
diff --git a/acs/nladmin-ui/src/assets/js/lodop/install_lodop64.exe b/acs/nladmin-ui/src/assets/js/lodop/install_lodop64.exe
new file mode 100644
index 0000000..7e5e4a3
Binary files /dev/null and b/acs/nladmin-ui/src/assets/js/lodop/install_lodop64.exe differ
diff --git a/acs/nladmin-ui/src/assets/logo/logo.png b/acs/nladmin-ui/src/assets/logo/logo.png
new file mode 100644
index 0000000..e263760
Binary files /dev/null and b/acs/nladmin-ui/src/assets/logo/logo.png differ
diff --git a/acs/nladmin-ui/src/assets/styles/btn.scss b/acs/nladmin-ui/src/assets/styles/btn.scss
new file mode 100644
index 0000000..8f47f2c
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/btn.scss
@@ -0,0 +1,99 @@
+@import 'variables';
+
+@mixin colorBtn($color) {
+ background: $color;
+
+ &:hover {
+ color: $color;
+
+ &:before,
+ &:after {
+ background: $color;
+ }
+ }
+}
+
+.blue-btn {
+ @include colorBtn($blue)
+}
+
+.light-blue-btn {
+ @include colorBtn($light-blue)
+}
+
+.red-btn {
+ @include colorBtn($red)
+}
+
+.pink-btn {
+ @include colorBtn($pink)
+}
+
+.green-btn {
+ @include colorBtn($green)
+}
+
+.tiffany-btn {
+ @include colorBtn($tiffany)
+}
+
+.yellow-btn {
+ @include colorBtn($yellow)
+}
+
+.pan-btn {
+ font-size: 14px;
+ color: #fff;
+ padding: 14px 36px;
+ border-radius: 8px;
+ border: none;
+ outline: none;
+ transition: 600ms ease all;
+ position: relative;
+ display: inline-block;
+
+ &:hover {
+ background: #fff;
+
+ &:before,
+ &:after {
+ width: 100%;
+ transition: 600ms ease all;
+ }
+ }
+
+ &:before,
+ &:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 2px;
+ width: 0;
+ transition: 400ms ease all;
+ }
+
+ &::after {
+ right: inherit;
+ top: inherit;
+ left: 0;
+ bottom: 0;
+ }
+}
+
+.custom-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ color: #fff;
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ padding: 10px 15px;
+ font-size: 14px;
+ border-radius: 4px;
+}
diff --git a/acs/nladmin-ui/src/assets/styles/eladmin.scss b/acs/nladmin-ui/src/assets/styles/eladmin.scss
new file mode 100644
index 0000000..89b347e
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/eladmin.scss
@@ -0,0 +1,205 @@
+.head-container {
+ padding-bottom: 10px;
+
+ .filter-item {
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0 3px 10px 0;
+
+ input {
+ height: 30.5px;
+ line-height: 30.5px;
+ }
+ }
+
+ .el-form-item-label {
+ margin: 0 3px 9px 0;
+ display: inline-block;
+ text-align: right;
+ vertical-align: middle;
+ font-size: 14px;
+ color: #606266;
+ line-height: 30.5px;
+ padding: 0 7px 0 7px;
+ }
+
+ .el-button + .el-button {
+ margin-left: 0 !important;
+ }
+
+ .el-select__caret.el-input__icon.el-icon-arrow-up {
+ line-height: 30.5px;
+ }
+
+ .date-item {
+ display: inline-block;
+ vertical-align: middle;
+ margin-bottom: 10px;
+ height: 30.5px !important;
+ width: 230px !important;
+ }
+}
+
+.el-avatar {
+ display: inline-block;
+ text-align: center;
+ background: #ccc;
+ color: #fff;
+ white-space: nowrap;
+ position: relative;
+ overflow: hidden;
+ vertical-align: middle;
+ width: 32px;
+ height: 32px;
+ line-height: 32px;
+ border-radius: 16px;
+}
+
+.logo-con {
+ height: 60px;
+ padding: 13px 0 0;
+
+ img {
+ height: 32px;
+ width: 135px;
+ display: block;
+ //margin: 0 auto;
+ }
+}
+
+#el-login-footer {
+ height: 40px;
+ line-height: 40px;
+ position: fixed;
+ bottom: 0;
+ width: 100%;
+ text-align: center;
+ color: #fff;
+ font-family: Arial, serif;
+ font-size: 12px;
+ letter-spacing: 1px;
+}
+
+#el-main-footer {
+ background: none repeat scroll 0 0 white;
+ border-top: 1px solid #e7eaec;
+ overflow: hidden;
+ padding: 10px 6px 0 6px;
+ height: 33px;
+ font-size: 0.7rem !important;
+ color: #7a8b9a;
+ letter-spacing: 0.8px;
+ font-family: Arial, sans-serif !important;
+ position: fixed;
+ bottom: 0;
+ z-index: 99;
+ width: 100%;
+}
+
+.eladmin-upload {
+ border: 1px dashed #c0ccda;
+ border-radius: 5px;
+ height: 45px;
+ line-height: 45px;
+ width: 368px;
+}
+
+.my-blockquote {
+ margin: 0 0 10px;
+ padding: 15px;
+ line-height: 22px;
+ border-left: 5px solid #00437B;
+ border-radius: 0 2px 2px 0;
+ background-color: #f2f2f2;
+}
+
+.my-code {
+ position: relative;
+ padding: 15px;
+ line-height: 20px;
+ border-left: 5px solid #ddd;
+ color: #333;
+ font-family: Courier New, serif;
+ font-size: 12px
+}
+
+.el-tabs {
+ margin-bottom: 25px;
+}
+
+
+//修改侧边栏菜单颜色和高度
+.el-menu-item, .el-submenu__title {
+ height: 40px !important;
+ //background-color: #776020 !important;
+}
+
+#app .sidebar-container .el-submenu .el-menu-item {
+}
+
+#app .sidebar-container .nest-menu .el-submenu > .el-submenu__title, #app .sidebar-container .el-submenu .el-menu-item {
+}
+
+#app .sidebar-container {
+ //background-color: #544b32 !important;
+}
+
+.el-form-item--small.el-form-item {
+ margin-bottom: 12px !important;
+}
+
+.el-form-item--mini.el-form-item {
+ margin-bottom: 10px !important;
+}
+
+//去除编辑文本框为数字时的上下箭头start
+.el-form--inline .el-form-item__content {
+ width: auto !important;
+}
+
+input[type="number"] {
+ -moz-appearance: textfield;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+}
+
+//去除编辑文本框为数字时的上下箭头end
+//设置计数器文字居左
+.el-input-number--mini .el-input__inner {
+ text-align: left;
+}
+
+.el-table:not(.el-table–scrollable-x) .el-table__fixed-right {
+ height: 100% !important;
+}
+
+// 修改弹出框距离
+.el-dialog__body {
+ padding-top: 0px !important;
+}
+
+//表格标题样式
+.el-table {
+ .el-table__header-wrapper,
+ .el-table__fixed-header-wrapper {
+ th {
+ word-break: break-word;
+ background-color: #f8f8f9;
+ color: #515a6e;
+ height: 35px;
+ font-size: 13px;
+ }
+ td{
+ color: #f8f8f9;
+ }
+ }
+ .el-table__body-wrapper {
+ .el-button [class*="el-icon-"] + span {
+ margin-left: 1px;
+ }
+ }
+}
+
diff --git a/acs/nladmin-ui/src/assets/styles/element-ui.scss b/acs/nladmin-ui/src/assets/styles/element-ui.scss
new file mode 100644
index 0000000..5c72fb9
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/element-ui.scss
@@ -0,0 +1,122 @@
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+ font-weight: 400 !important;
+}
+
+.el-upload {
+ input[type="file"] {
+ display: none !important;
+ }
+}
+
+.el-upload__input {
+ display: none;
+}
+
+.cell {
+ .el-tag {
+ margin-right: 0px;
+ }
+}
+
+.small-padding {
+ .cell {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+.fixed-width {
+ .el-button--mini {
+ padding: 7px 10px;
+ width: 60px;
+ }
+}
+
+.status-col {
+ .cell {
+ padding: 0 10px;
+ text-align: center;
+
+ .el-tag {
+ margin-right: 0px;
+ }
+ }
+}
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+ transform: none;
+ left: 0;
+ position: relative;
+ margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+ .el-upload {
+ width: 100%;
+
+ .el-upload-dragger {
+ width: 100%;
+ height: 200px;
+ }
+ }
+}
+
+// dropdown
+.el-dropdown-menu {
+ a {
+ display: block;
+ }
+}
+
+// fix date-picker ui bug in filter-item
+.el-range-editor.el-input__inner {
+ display: inline-flex !important;
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+ box-sizing: content-box;
+}
+
+.el-menu--collapse
+> div
+> .el-submenu
+> .el-submenu__title
+.el-submenu__icon-arrow {
+ display: none;
+}
+
+.el-form-search {
+ float: right;
+ .el-form-search-item {
+ margin-bottom: 0px;
+ .el-input__inner {
+ width: 140px;
+ }
+ }
+}
+
+el-table .el-table__cell {
+ padding: 8px 0;
+}
+
+.el-table--medium .el-table__cell {
+ padding: 6px 0;
+}
+
+.el-table--small .el-table__cell {
+ padding: 3px 0;
+}
+
+.el-table--mini .el-table__cell {
+ padding: 1px 0;
+}
+
+.el-dialog__body {
+ padding: 20px 20px;
+}
diff --git a/acs/nladmin-ui/src/assets/styles/element-variables.scss b/acs/nladmin-ui/src/assets/styles/element-variables.scss
new file mode 100644
index 0000000..a4f8c4a
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/element-variables.scss
@@ -0,0 +1,31 @@
+/**
+* I think element-ui's default theme color is too light for long-term use.
+* So I modified the default color and you can modify it to your liking.
+**/
+
+/* theme color */
+$--color-primary: #1890ff;
+$--color-success: #13ce66;
+$--color-warning: #FFBA00;
+$--color-danger: #ff4949;
+// $--color-info: #1E1E1E;
+
+$--button-font-weight: 400;
+
+// $--color-text-regular: #1f2d3d;
+
+$--border-color-light: #dfe4ed;
+$--border-color-lighter: #e6ebf5;
+
+$--table-border:1px solid#dfe6ec;
+
+/* icon font path, required */
+$--font-path: '~element-ui/lib/theme-chalk/fonts';
+
+@import "../../../node_modules/element-ui/packages/theme-chalk/src/index";
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ theme: $--color-primary;
+}
diff --git a/acs/nladmin-ui/src/assets/styles/index.scss b/acs/nladmin-ui/src/assets/styles/index.scss
new file mode 100644
index 0000000..21fbda1
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/index.scss
@@ -0,0 +1,182 @@
+@import 'variables';
+@import 'mixin';
+@import 'transition';
+@import 'element-ui';
+@import 'sidebar';
+@import 'btn';
+@import 'eladmin';
+
+body {
+ height: 100%;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+ font-weight: 700;
+}
+
+html {
+ height: 100%;
+ box-sizing: border-box;
+}
+
+#app {
+ height: 100%;
+}
+
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+
+.no-padding {
+ padding: 0 !important;
+}
+
+.padding-content {
+ padding: 4px 0;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+ cursor: pointer;
+ color: inherit;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
+
+.fr {
+ float: right;
+}
+
+.fl {
+ float: left;
+}
+
+.pr-5 {
+ padding-right: 5px;
+}
+
+.pl-5 {
+ padding-left: 5px;
+}
+
+.block {
+ display: block;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.inlineBlock {
+ display: block;
+}
+
+.clearfix {
+ &:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+}
+
+aside {
+ background: #eef1f6;
+ padding: 8px 24px;
+ margin-bottom: 20px;
+ border-radius: 2px;
+ display: block;
+ line-height: 32px;
+ font-size: 16px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+ color: #2c3e50;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ a {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+ }
+}
+
+//main-container全局样式
+.app-container {
+ padding: 20px 20px 45px 20px;
+}
+
+.components-container {
+ margin: 30px 50px;
+ position: relative;
+}
+
+.pagination-container {
+ margin-top: 30px;
+}
+
+.text-center {
+ text-align: center
+}
+
+.sub-navbar {
+ height: 50px;
+ line-height: 50px;
+ position: relative;
+ width: 100%;
+ text-align: right;
+ padding-right: 20px;
+ transition: 600ms ease position;
+ background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+
+ .subtitle {
+ font-size: 20px;
+ color: #fff;
+ }
+
+ &.draft {
+ background: #d0d0d0;
+ }
+
+ &.deleted {
+ background: #d0d0d0;
+ }
+}
+
+.link-type,
+.link-type:focus {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+}
+
+//refine vue-multiselect plugin
+.multiselect {
+ line-height: 16px;
+}
+
+.multiselect--active {
+ z-index: 1000 !important;
+}
diff --git a/acs/nladmin-ui/src/assets/styles/mixin.scss b/acs/nladmin-ui/src/assets/styles/mixin.scss
new file mode 100644
index 0000000..06fa061
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/mixin.scss
@@ -0,0 +1,66 @@
+@mixin clearfix {
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+@mixin scrollBar {
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+}
+
+@mixin relative {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+@mixin pct($pct) {
+ width: #{$pct};
+ position: relative;
+ margin: 0 auto;
+}
+
+@mixin triangle($width, $height, $color, $direction) {
+ $width: $width/2;
+ $color-border-style: $height solid $color;
+ $transparent-border-style: $width solid transparent;
+ height: 0;
+ width: 0;
+
+ @if $direction==up {
+ border-bottom: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==right {
+ border-left: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+
+ @else if $direction==down {
+ border-top: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==left {
+ border-right: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+}
diff --git a/acs/nladmin-ui/src/assets/styles/sidebar.scss b/acs/nladmin-ui/src/assets/styles/sidebar.scss
new file mode 100644
index 0000000..17381fc
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/sidebar.scss
@@ -0,0 +1,209 @@
+#app {
+
+ .main-container {
+ min-height: 100%;
+ transition: margin-left .28s;
+ margin-left: $sideBarWidth;
+ position: relative;
+ }
+
+ .sidebar-container {
+ transition: width 0.28s;
+ width: $sideBarWidth !important;
+ background-color: $menuBg;
+ height: 100%;
+ position: fixed;
+ font-size: 0;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1001;
+ overflow: hidden;
+
+ // reset element-ui css
+ .horizontal-collapse-transition {
+ transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+ }
+
+ .scrollbar-wrapper {
+ overflow-x: hidden !important;
+ }
+
+ .el-scrollbar__bar.is-vertical {
+ right: 0;
+ }
+
+ .el-scrollbar {
+ height: 100%;
+ }
+
+ &.has-logo {
+ .el-scrollbar {
+ height: calc(100% - 50px);
+ }
+ }
+
+ .is-horizontal {
+ display: none;
+ }
+
+ a {
+ display: inline-block;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .svg-icon {
+ margin-right: 16px;
+ }
+
+ .el-menu {
+ border: none;
+ height: 100%;
+ width: 100% !important;
+ }
+
+ // menu hover
+ .submenu-title-noDropdown,
+ .el-submenu__title {
+ &:hover {
+ background-color: $menuHover !important;
+ }
+ }
+
+ .is-active>.el-submenu__title {
+ color: $subMenuActiveText !important;
+ }
+
+ & .nest-menu .el-submenu>.el-submenu__title,
+ & .el-submenu .el-menu-item {
+ min-width: $sideBarWidth !important;
+ background-color: $subMenuBg !important;
+
+ &:hover {
+ background-color: $subMenuHover !important;
+ }
+ }
+ }
+
+ .hideSidebar {
+ .sidebar-container {
+ width: 54px !important;
+ }
+
+ .main-container {
+ margin-left: 54px;
+ }
+
+ .submenu-title-noDropdown {
+ padding: 0 !important;
+ position: relative;
+
+ .el-tooltip {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+ }
+ }
+
+ .el-submenu {
+ overflow: hidden;
+
+ &>.el-submenu__title {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+
+ .el-submenu__icon-arrow {
+ display: none;
+ }
+ }
+ }
+
+ .el-menu--collapse {
+ .el-submenu {
+ &>.el-submenu__title {
+ &>span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ }
+ }
+ }
+ }
+
+ .el-menu--collapse .el-menu .el-submenu {
+ min-width: $sideBarWidth !important;
+ }
+
+ // mobile responsive
+ .mobile {
+ .main-container {
+ margin-left: 0;
+ }
+
+ .sidebar-container {
+ transition: transform .28s;
+ width: $sideBarWidth !important;
+ }
+
+ &.hideSidebar {
+ .sidebar-container {
+ pointer-events: none;
+ transition-duration: 0.3s;
+ transform: translate3d(-$sideBarWidth, 0, 0);
+ }
+ }
+ }
+
+ .withoutAnimation {
+
+ .main-container,
+ .sidebar-container {
+ transition: none;
+ }
+ }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+ &>.el-menu {
+ .svg-icon {
+ margin-right: 16px;
+ }
+ }
+
+ .nest-menu .el-submenu>.el-submenu__title,
+ .el-menu-item {
+ &:hover {
+ // you can use $subMenuHover
+ background-color: $menuHover !important;
+ }
+ }
+
+ // the scroll bar appears when the subMenu is too long
+ >.el-menu--popup {
+ max-height: 100vh;
+ overflow-y: auto;
+
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+ }
+}
diff --git a/acs/nladmin-ui/src/assets/styles/transition.scss b/acs/nladmin-ui/src/assets/styles/transition.scss
new file mode 100644
index 0000000..4cb27cc
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/transition.scss
@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+ transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+ opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+ transition: all .5s;
+}
+
+.fade-transform-enter {
+ opacity: 0;
+ transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+ opacity: 0;
+ transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+ transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+ opacity: 0;
+ transform: translateX(20px);
+}
+
+.breadcrumb-move {
+ transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+ position: absolute;
+}
diff --git a/acs/nladmin-ui/src/assets/styles/variables.scss b/acs/nladmin-ui/src/assets/styles/variables.scss
new file mode 100644
index 0000000..384517b
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/styles/variables.scss
@@ -0,0 +1,48 @@
+// base color
+$blue:#324157;
+$light-blue:#3A71A8;
+$red:#C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow:#FEC171;
+$panGreen: #30B08F;
+
+$base-logo-title-color: #ffffff;
+$base-logo-light-title-color: #001529;
+$base-menu-light-background:#ffffff;
+
+// sidebar
+$menuText:#bfcbd9;
+$menuActiveText:#409EFF;
+$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:#304156; //https://cloud.tencent.com/developer/article/1753773
+$menuHover:#263445;
+
+$base-menu-light-color:rgba(0,0,0,.70);
+
+$subMenuBg:#1f2d3d;
+$subMenuHover:#001528;
+
+$sideBarWidth: 205px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ menuText: $menuText;
+ menuActiveText: $menuActiveText;
+ subMenuActiveText: $subMenuActiveText;
+ menuBg: $menuBg;
+ menuLightBackground: $base-menu-light-background;
+ menuLightColor: $base-menu-light-color;
+ menuHover: $menuHover;
+ subMenuBg: $subMenuBg;
+ subMenuHover: $subMenuHover;
+ sideBarWidth: $sideBarWidth;
+
+ logoTitleColor: $base-logo-title-color;
+ logoLightTitleColor: $base-logo-light-title-color
+}
+
+$base-sidebar-width: 200px;
diff --git a/acs/nladmin-ui/src/assets/wms/1.png b/acs/nladmin-ui/src/assets/wms/1.png
new file mode 100644
index 0000000..1ec6a1a
Binary files /dev/null and b/acs/nladmin-ui/src/assets/wms/1.png differ
diff --git a/acs/nladmin-ui/src/assets/wms/2.png b/acs/nladmin-ui/src/assets/wms/2.png
new file mode 100644
index 0000000..9278ba2
Binary files /dev/null and b/acs/nladmin-ui/src/assets/wms/2.png differ
diff --git a/acs/nladmin-ui/src/assets/wms/3.png b/acs/nladmin-ui/src/assets/wms/3.png
new file mode 100644
index 0000000..b19456a
Binary files /dev/null and b/acs/nladmin-ui/src/assets/wms/3.png differ
diff --git a/acs/nladmin-ui/src/assets/wms/4.png b/acs/nladmin-ui/src/assets/wms/4.png
new file mode 100644
index 0000000..358d41d
Binary files /dev/null and b/acs/nladmin-ui/src/assets/wms/4.png differ
diff --git a/acs/nladmin-ui/src/components/Breadcrumb/index.vue b/acs/nladmin-ui/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..204ea59
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Breadcrumb/index.vue
@@ -0,0 +1,81 @@
+
+
+
+
+ {{ item.meta.title }}
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Crud/CRUD.operation.vue b/acs/nladmin-ui/src/components/Crud/CRUD.operation.vue
new file mode 100644
index 0000000..4c5cc02
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Crud/CRUD.operation.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+ 全选
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Crud/Pagination.vue b/acs/nladmin-ui/src/components/Crud/Pagination.vue
new file mode 100644
index 0000000..d4482fb
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Crud/Pagination.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Crud/RR.operation.vue b/acs/nladmin-ui/src/components/Crud/RR.operation.vue
new file mode 100644
index 0000000..6bcfcbb
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Crud/RR.operation.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+ 查询
+
+ 重置
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Crud/UD.operation.vue b/acs/nladmin-ui/src/components/Crud/UD.operation.vue
new file mode 100644
index 0000000..686247d
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Crud/UD.operation.vue
@@ -0,0 +1,80 @@
+
+
+
修改
+
+ {{ msg }}
+
+ 取消
+ 确定
+
+ 删除
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Crud/crud.js b/acs/nladmin-ui/src/components/Crud/crud.js
new file mode 100644
index 0000000..523fd18
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Crud/crud.js
@@ -0,0 +1,963 @@
+import { download, initData } from '@/api/data'
+import { downloadFile, parseTime } from '@/utils/index'
+import Vue from 'vue'
+
+/**
+ * CRUD配置
+ * @author moxun
+ * @param {*} options
+ * @return crud instance.
+ * @example
+ * 要使用多crud时,请在关联crud的组件处使用crud-tag进行标记,如:
+ */
+function CRUD(options) {
+ const defaultOptions = {
+ tag: 'default',
+ // id字段名
+ idField: 'id',
+ // 标题
+ title: '',
+ // 请求数据的url
+ url: '',
+ // 表格数据
+ data: [],
+ // 选择项
+ selections: [],
+ // 待查询的对象
+ query: {},
+ // 查询数据的参数
+ params: {},
+ // Form 表单
+ form: {},
+ // 重置表单
+ defaultForm: () => {
+ },
+ // 排序规则,默认 id 降序, 支持多字段排序 ['id,desc', 'createTime,asc']
+ sort: ['id,desc'],
+ // 等待时间
+ time: 50,
+ // CRUD Method
+ crudMethod: {
+ add: (form) => {
+ },
+ del: (id) => {
+ },
+ edit: (form) => {
+ },
+ get: (id) => {
+ }
+ },
+ // 主页操作栏显示哪些按钮
+ optShow: {
+ add: true,
+ edit: true,
+ del: true,
+ download: false,
+ reset: true
+ },
+ // 自定义一些扩展属性
+ props: {},
+ // 在主页准备
+ queryOnPresenterCreated: true,
+ // 调试开关
+ debug: false
+ }
+ options = mergeOptions(defaultOptions, options)
+ const data = {
+ ...options,
+ // 记录数据状态
+ dataStatus: {},
+ status: {
+ add: CRUD.STATUS.NORMAL,
+ edit: CRUD.STATUS.NORMAL,
+ view: CRUD.STATUS.NORMAL,
+ // 添加或编辑状态
+ get cu() {
+ if (this.add === CRUD.STATUS.NORMAL && this.edit === CRUD.STATUS.NORMAL) {
+ return CRUD.STATUS.NORMAL
+ } else if (this.add === CRUD.STATUS.PREPARED || this.edit === CRUD.STATUS.PREPARED) {
+ return CRUD.STATUS.PREPARED
+ } else if (this.add === CRUD.STATUS.PROCESSING || this.edit === CRUD.STATUS.PROCESSING) {
+ return CRUD.STATUS.PROCESSING
+ }
+ throw new Error('wrong crud\'s cu status')
+ },
+ // 标题
+ get title() {
+ return this.add > CRUD.STATUS.NORMAL ? `新增${crud.title}` : this.edit > CRUD.STATUS.NORMAL ? `编辑${crud.title}` : crud.title
+ }
+ },
+ msg: {
+ submit: '提交成功',
+ add: '新增成功',
+ edit: '编辑成功',
+ del: '删除成功'
+ },
+ page: {
+ // 页码
+ page: 0,
+ // 每页数据条数
+ size: 10,
+ // 总数据条数
+ total: 0
+ },
+ // 整体loading
+ loading: false,
+ // 导出的 Loading
+ downloadLoading: false,
+ // 导出csv的 Loading
+ downloadcsvLoading: false,
+ // 删除的 Loading
+ delAllLoading: false
+ }
+ const methods = {
+ /**
+ * 通用的提示
+ */
+ submitSuccessNotify() {
+ crud.notify(crud.msg.submit, CRUD.NOTIFICATION_TYPE.SUCCESS)
+ },
+ addSuccessNotify() {
+ crud.notify(crud.msg.add, CRUD.NOTIFICATION_TYPE.SUCCESS)
+ },
+ editSuccessNotify() {
+ crud.notify(crud.msg.edit, CRUD.NOTIFICATION_TYPE.SUCCESS)
+ },
+ delSuccessNotify() {
+ crud.notify(crud.msg.del, CRUD.NOTIFICATION_TYPE.SUCCESS)
+ },
+ // 搜索
+ toQuery() {
+ crud.page.page = 1
+ crud.refresh()
+ },
+ // 刷新
+ refresh() {
+ if (!callVmHook(crud, CRUD.HOOK.beforeRefresh)) {
+ return
+ }
+ return new Promise((resolve, reject) => {
+ crud.loading = true
+ // 请求数据
+ initData(crud.url, crud.getQueryParams()).then(data => {
+ const table = crud.getTable()
+ if (table && table.lazy) { // 懒加载子节点数据,清掉已加载的数据
+ table.store.states.treeData = {}
+ table.store.states.lazyTreeNodeMap = {}
+ }
+ crud.page.total = data.totalElements
+ crud.data = data.content
+ crud.resetDataStatus()
+ // time 毫秒后显示表格
+ setTimeout(() => {
+ crud.loading = false
+ callVmHook(crud, CRUD.HOOK.afterRefresh)
+ }, crud.time)
+ resolve(data)
+ }).catch(err => {
+ crud.loading = false
+ reject(err)
+ })
+ })
+ },
+ /**
+ * 格式化数据,保留0位小数
+ */
+ formatNum0(row, column) {
+ if (!row[column.property]) {
+ return 0
+ }
+ return parseFloat(row[column.property]).toFixed(0)
+ },
+ /**
+ * 格式化数据,保留2位小数
+ */
+ formatNum2(row, column) {
+ if (!row[column.property]) {
+ return 0
+ }
+ return parseFloat(row[column.property]).toFixed(2)
+ },
+
+ /**
+ * 格式化数据,保留3位小数
+ */
+ formatNum3(row, column) {
+ if (!row[column.property]) {
+ return 0
+ }
+ return parseFloat(row[column.property]).toFixed(3)
+ },
+
+ /**
+ * 质检格式化数据,保留4位小数
+ */
+ formatQlNum4(row, column) {
+ if (!row[column.property]) {
+ return ''
+ }
+ return parseFloat(row[column.property]).toFixed(4)
+ },
+ /**
+ * 启动添加
+ */
+ toAdd() {
+ crud.resetForm()
+ if (!(callVmHook(crud, CRUD.HOOK.beforeToAdd, crud.form) && callVmHook(crud, CRUD.HOOK.beforeToCU, crud.form))) {
+ return
+ }
+ crud.status.add = CRUD.STATUS.PREPARED
+ callVmHook(crud, CRUD.HOOK.afterToAdd, crud.form)
+ callVmHook(crud, CRUD.HOOK.afterToCU, crud.form)
+ },
+ /**
+ * 启动添加 可携带参数
+ */
+ toAddAndData(data) {
+ crud.resetForm(JSON.parse(JSON.stringify(data)))
+ if (!(callVmHook(crud, CRUD.HOOK.beforeToAdd, crud.form) && callVmHook(crud, CRUD.HOOK.beforeToCU, crud.form))) {
+ return
+ }
+ crud.status.add = CRUD.STATUS.PREPARED
+ callVmHook(crud, CRUD.HOOK.afterToAdd, crud.form)
+ callVmHook(crud, CRUD.HOOK.afterToCU, crud.form)
+ },
+ /**
+ * 启动编辑
+ * @param {*} data 数据项
+ */
+ toEdit(data) {
+ crud.resetForm(JSON.parse(JSON.stringify(data)))
+ if (!(callVmHook(crud, CRUD.HOOK.beforeToEdit, crud.form) && callVmHook(crud, CRUD.HOOK.beforeToCU, crud.form))) {
+ return
+ }
+ crud.status.edit = CRUD.STATUS.PREPARED
+ crud.getDataStatus(crud.getDataId(data)).edit = CRUD.STATUS.PREPARED
+ callVmHook(crud, CRUD.HOOK.afterToEdit, crud.form)
+ callVmHook(crud, CRUD.HOOK.afterToCU, crud.form)
+ },
+ /**
+ * 查询详情
+ * @param {*} data 数据项
+ */
+ toView(data) {
+ crud.params.optRow = data
+ crud.resetForm(JSON.parse(JSON.stringify(data)))
+ crud.status.view = CRUD.STATUS.PREPARED
+ crud.getDataStatus(crud.getDataId(data)).view = CRUD.STATUS.PREPARED
+ callVmHook(crud, CRUD.HOOK.afterToView, crud.form)
+ },
+ /**
+ * 启动删除
+ * @param {*} data 数据项
+ */
+ toDelete(data) {
+ crud.getDataStatus(crud.getDataId(data)).delete = CRUD.STATUS.PREPARED
+ },
+ /**
+ * 取消删除
+ * @param {*} data 数据项
+ */
+ cancelDelete(data) {
+ if (!callVmHook(crud, CRUD.HOOK.beforeDeleteCancel, data)) {
+ return
+ }
+ crud.getDataStatus(crud.getDataId(data)).delete = CRUD.STATUS.NORMAL
+ callVmHook(crud, CRUD.HOOK.afterDeleteCancel, data)
+ },
+ /**
+ * 取消新增/编辑
+ */
+ cancelCU(formName) {
+ if (formName instanceof PointerEvent) {
+ formName = 'form'
+ }
+
+ const addStatus = crud.status.add
+ const editStatus = crud.status.edit
+ const viewStatus = crud.status.view
+ if (addStatus === CRUD.STATUS.PREPARED) {
+ if (!callVmHook(crud, CRUD.HOOK.beforeAddCancel, crud.form)) {
+ return
+ }
+ crud.status.add = CRUD.STATUS.NORMAL
+ }
+ if (viewStatus === CRUD.STATUS.PREPARED) {
+ crud.status.view = CRUD.STATUS.NORMAL
+ }
+ if (editStatus === CRUD.STATUS.PREPARED) {
+ if (!callVmHook(crud, CRUD.HOOK.beforeEditCancel, crud.form)) {
+ return
+ }
+ crud.status.edit = CRUD.STATUS.NORMAL
+ crud.getDataStatus(crud.getDataId(crud.form)).edit = CRUD.STATUS.NORMAL
+ }
+ crud.resetForm()
+ if (addStatus === CRUD.STATUS.PREPARED) {
+ callVmHook(crud, CRUD.HOOK.afterAddCancel, crud.form)
+ }
+ if (editStatus === CRUD.STATUS.PREPARED) {
+ callVmHook(crud, CRUD.HOOK.afterEditCancel, crud.form)
+ }
+ // 清除表单验证
+ if (crud.findVM('form').$refs[formName]) {
+ crud.findVM('form').$refs[formName].clearValidate()
+ }
+ },
+ /**
+ * 提交新增/编辑
+ */
+ submitCU(formName) {
+ if (formName instanceof PointerEvent) {
+ formName = 'form'
+ }
+ if (!callVmHook(crud, CRUD.HOOK.beforeValidateCU)) {
+ return
+ }
+ crud.findVM('form').$refs[formName].validate(valid => {
+ if (!valid) {
+ return
+ }
+ if (!callVmHook(crud, CRUD.HOOK.afterValidateCU)) {
+ return
+ }
+ if (crud.status.add === CRUD.STATUS.PREPARED) {
+ crud.doAdd()
+ } else if (crud.status.edit === CRUD.STATUS.PREPARED) {
+ crud.doEdit()
+ }
+ })
+ },
+ /**
+ * 执行添加
+ */
+ doAdd() {
+ if (!callVmHook(crud, CRUD.HOOK.beforeSubmit)) {
+ return
+ }
+ crud.status.add = CRUD.STATUS.PROCESSING
+ crud.crudMethod.add(crud.form).then(() => {
+ crud.status.add = CRUD.STATUS.NORMAL
+ crud.resetForm()
+ crud.addSuccessNotify()
+ callVmHook(crud, CRUD.HOOK.afterSubmit)
+ crud.toQuery()
+ }).catch(() => {
+ crud.status.add = CRUD.STATUS.PREPARED
+ callVmHook(crud, CRUD.HOOK.afterAddError)
+ })
+ },
+ /**
+ * 执行编辑
+ */
+ doEdit() {
+ if (!callVmHook(crud, CRUD.HOOK.beforeSubmit)) {
+ return
+ }
+ crud.status.edit = CRUD.STATUS.PROCESSING
+ crud.crudMethod.edit(crud.form).then(() => {
+ crud.status.edit = CRUD.STATUS.NORMAL
+ crud.getDataStatus(crud.getDataId(crud.form)).edit = CRUD.STATUS.NORMAL
+ crud.editSuccessNotify()
+ crud.resetForm()
+ callVmHook(crud, CRUD.HOOK.afterSubmit)
+ crud.refresh()
+ }).catch(() => {
+ crud.status.edit = CRUD.STATUS.PREPARED
+ callVmHook(crud, CRUD.HOOK.afterEditError)
+ })
+ },
+ /**
+ * 执行删除
+ * @param {*} data 数据项
+ */
+ doDelete(data) {
+ let delAll = false
+ let dataStatus
+ const ids = []
+ if (data instanceof Array) {
+ delAll = true
+ data.forEach(val => {
+ ids.push(this.getDataId(val))
+ })
+ } else {
+ ids.push(this.getDataId(data))
+ dataStatus = crud.getDataStatus(this.getDataId(data))
+ }
+ if (!callVmHook(crud, CRUD.HOOK.beforeDelete, data)) {
+ return
+ }
+ if (!delAll) {
+ dataStatus.delete = CRUD.STATUS.PROCESSING
+ }
+ return crud.crudMethod.del(ids).then(() => {
+ if (delAll) {
+ crud.delAllLoading = false
+ } else {
+ dataStatus.delete = CRUD.STATUS.PREPARED
+ }
+ crud.dleChangePage(1)
+ crud.delSuccessNotify()
+ callVmHook(crud, CRUD.HOOK.afterDelete, data)
+ crud.refresh()
+ }).catch(() => {
+ if (delAll) {
+ crud.delAllLoading = false
+ } else {
+ dataStatus.delete = CRUD.STATUS.PREPARED
+ }
+ })
+ },
+ /**
+ * 通用导出
+ */
+ doExport() {
+ crud.downloadLoading = true
+ download(crud.url + '/download', crud.getQueryParams()).then(result => {
+ downloadFile(result, crud.title + '数据', 'xlsx')
+ crud.downloadLoading = false
+ }).catch(() => {
+ crud.downloadLoading = false
+ })
+ },
+ doExportCSV() {
+ crud.downloadcsvLoading = true
+ download(crud.url + '/downloadCSV', crud.getQueryParams()).then(result => {
+ downloadFile(result, crud.title + '数据', 'csv')
+ crud.downloadcsvLoading = false
+ }).catch(() => {
+ crud.downloadcsvLoading = false
+ })
+ },
+ /**
+ * 获取查询参数
+ */
+ getQueryParams: function() {
+ // 清除参数无值的情况
+ Object.keys(crud.query).length !== 0 && Object.keys(crud.query).forEach(item => {
+ if (crud.query[item] === null || crud.query[item] === '') crud.query[item] = undefined
+ })
+ Object.keys(crud.params).length !== 0 && Object.keys(crud.params).forEach(item => {
+ if (crud.params[item] === null || crud.params[item] === '') crud.params[item] = undefined
+ })
+ return {
+ page: crud.page.page - 1,
+ size: crud.page.size,
+ sort: crud.sort,
+ ...crud.query,
+ ...crud.params
+ }
+ },
+ // 当前页改变
+ pageChangeHandler(e) {
+ crud.page.page = e
+ crud.refresh()
+ },
+ // 每页条数改变
+ sizeChangeHandler(e) {
+ crud.page.size = e
+ crud.page.page = 1
+ crud.refresh()
+ },
+ // 预防删除第二页最后一条数据时,或者多选删除第二页的数据时,页码错误导致请求无数据
+ dleChangePage(size) {
+ if (crud.data.length === size && crud.page.page !== 1) {
+ crud.page.page -= 1
+ }
+ },
+ // 选择改变
+ selectionChangeHandler(val) {
+ crud.selections = val
+ },
+ /**
+ * 重置查询参数
+ * @param {Boolean} toQuery 重置后进行查询操作
+ */
+ resetQuery(toQuery = true) {
+ const defaultQuery = JSON.parse(JSON.stringify(crud.defaultQuery))
+ const query = crud.query
+ Object.keys(query).forEach(key => {
+ query[key] = defaultQuery[key]
+ })
+ // 重置参数
+ this.params = {}
+ if (toQuery) {
+ crud.toQuery()
+ }
+ },
+ /**
+ * 重置表单
+ * @param {Array} data 数据
+ */
+ resetForm(data) {
+ const form = data || (typeof crud.defaultForm === 'object' ? JSON.parse(JSON.stringify(crud.defaultForm)) : crud.defaultForm.apply(crud.findVM('form')))
+ const crudFrom = crud.form
+ for (const key in form) {
+ if (crudFrom.hasOwnProperty(key)) {
+ crudFrom[key] = form[key]
+ } else {
+ Vue.set(crudFrom, key, form[key])
+ }
+ }
+ // add by ghl 2020-10-04 页面重复添加信息时,下拉框的校验会存在,需要找工取消
+ let form_ref = 'form'
+ if (crudFrom.form_ref) form_ref = crudFrom.form_ref
+ if (crud.findVM('form').$refs[form_ref]) {
+ crud.findVM('form').$refs[form_ref].clearValidate()
+ }
+ },
+ /**
+ * 重置数据状态
+ */
+ resetDataStatus() {
+ const dataStatus = {}
+
+ function resetStatus(datas) {
+ datas.forEach(e => {
+ dataStatus[crud.getDataId(e)] = {
+ delete: 0,
+ edit: 0
+ }
+ if (e.children) {
+ resetStatus(e.children)
+ }
+ })
+ }
+
+ resetStatus(crud.data)
+ crud.dataStatus = dataStatus
+ },
+ /**
+ * 获取数据状态
+ * @param {Number | String} id 数据项id
+ */
+ getDataStatus(id) {
+ return crud.dataStatus[id]
+ },
+ /**
+ * 用于树形表格多选, 选中所有
+ * @param selection
+ */
+ selectAllChange(selection) {
+ // 如果选中的数目与请求到的数目相同就选中子节点,否则就清空选中
+ if (selection && selection.length === crud.data.length) {
+ selection.forEach(val => {
+ crud.selectChange(selection, val)
+ })
+ } else {
+ crud.getTable().clearSelection()
+ }
+ },
+ /**
+ * 用于树形表格多选,单选的封装
+ * @param selection
+ * @param row
+ */
+ selectChange(selection, row) {
+ // 如果selection中存在row代表是选中,否则是取消选中
+ if (selection.find(val => {
+ return crud.getDataId(val) === crud.getDataId(row)
+ })) {
+ if (row.children) {
+ row.children.forEach(val => {
+ crud.getTable().toggleRowSelection(val, true)
+ selection.push(val)
+ if (val.children) {
+ crud.selectChange(selection, val)
+ }
+ })
+ }
+ } else {
+ crud.toggleRowSelection(selection, row)
+ }
+ },
+ /**
+ * 切换选中状态
+ * @param selection
+ * @param data
+ */
+ toggleRowSelection(selection, data) {
+ if (data.children) {
+ data.children.forEach(val => {
+ crud.getTable().toggleRowSelection(val, false)
+ if (val.children) {
+ crud.toggleRowSelection(selection, val)
+ }
+ })
+ }
+ },
+ findVM(type) {
+ return crud.vms.find(vm => vm && vm.type === type).vm
+ },
+ notify(title, type = CRUD.NOTIFICATION_TYPE.INFO) {
+ crud.vms[0].vm.$notify({
+ title,
+ type,
+ duration: 2500
+ })
+ },
+ updateProp(name, value) {
+ Vue.set(crud.props, name, value)
+ },
+ getDataId(data) {
+ return data[this.idField]
+ },
+ getTable() {
+ return this.findVM('presenter').$refs.table
+ },
+ attchTable() {
+ const table = this.getTable()
+ this.updateProp('table', table)
+ const that = this
+ table.$on('expand-change', (row, expanded) => {
+ if (!expanded) {
+ return
+ }
+ const lazyTreeNodeMap = table.store.states.lazyTreeNodeMap
+ row.children = lazyTreeNodeMap[crud.getDataId(row)]
+ if (row.children) {
+ row.children.forEach(ele => {
+ const id = crud.getDataId(ele)
+ if (that.dataStatus[id] === undefined) {
+ that.dataStatus[id] = {
+ delete: 0,
+ edit: 0
+ }
+ }
+ })
+ }
+ })
+ }
+ }
+ const crud = Object.assign({}, data)
+ // 可观测化
+ Vue.observable(crud)
+ // 附加方法
+ Object.assign(crud, methods)
+ // 记录初始默认的查询参数,后续重置查询时使用
+ Object.assign(crud, {
+ defaultQuery: JSON.parse(JSON.stringify(data.query)),
+ // 预留4位存储:组件 主页、头部、分页、表单,调试查看也方便找
+ vms: Array(4),
+ /**
+ * 注册组件实例
+ * @param {String} type 类型
+ * @param {*} vm 组件实例
+ * @param {Number} index 该参数内部使用
+ */
+ registerVM(type, vm, index = -1) {
+ const vmObj = {
+ type,
+ vm: vm
+ }
+ if (index < 0) {
+ this.vms.push(vmObj)
+ return
+ }
+ if (index < 4) { // 内置预留vm数
+ this.vms[index] = vmObj
+ return
+ }
+ this.vms.length = Math.max(this.vms.length, index)
+ this.vms.splice(index, 1, vmObj)
+ },
+ /**
+ * 取消注册组件实例
+ * @param {*} vm 组件实例
+ */
+ unregisterVM(type, vm) {
+ for (let i = this.vms.length - 1; i >= 0; i--) {
+ if (this.vms[i] === undefined) {
+ continue
+ }
+ if (this.vms[i].type === type && this.vms[i].vm === vm) {
+ if (i < 4) { // 内置预留vm数
+ this.vms[i] = undefined
+ } else {
+ this.vms.splice(i, 1)
+ }
+ break
+ }
+ }
+ }
+ })
+ // 冻结处理,需要扩展数据的话,使用crud.updateProp(name, value),以crud.props.name形式访问,这个是响应式的,可以做数据绑定
+ Object.freeze(crud)
+ return crud
+}
+
+// hook VM
+function callVmHook(crud, hook) {
+ if (crud.debug) {
+ console.log('callVmHook: ' + hook)
+ }
+ const tagHook = crud.tag ? hook + '$' + crud.tag : null
+ let ret = true
+ const nargs = [crud]
+ for (let i = 2; i < arguments.length; ++i) {
+ nargs.push(arguments[i])
+ }
+ // 有些组件扮演了多个角色,调用钩子时,需要去重
+ const vmSet = new Set()
+ crud.vms.forEach(vm => vm && vmSet.add(vm.vm))
+ vmSet.forEach(vm => {
+ if (vm[hook]) {
+ ret = vm[hook].apply(vm, nargs) !== false && ret
+ }
+ if (tagHook && vm[tagHook]) {
+ ret = vm[tagHook].apply(vm, nargs) !== false && ret
+ }
+ })
+ return ret
+}
+
+function mergeOptions(src, opts) {
+ const optsRet = {
+ ...src
+ }
+ for (const key in src) {
+ if (opts.hasOwnProperty(key)) {
+ optsRet[key] = opts[key]
+ }
+ }
+ return optsRet
+}
+
+/**
+ * 查找crud
+ * @param {*} vm
+ * @param {string} tag
+ */
+function lookupCrud(vm, tag) {
+ tag = tag || vm.$attrs['crud-tag'] || 'default'
+ // function lookupCrud(vm, tag) {
+ if (vm.$crud) {
+ const ret = vm.$crud[tag]
+ if (ret) {
+ return ret
+ }
+ }
+ return vm.$parent ? lookupCrud(vm.$parent, tag) : undefined
+}
+
+/**
+ * crud主页
+ */
+function presenter(crud) {
+ if (crud) {
+ console.warn('[CRUD warn]: ' + 'please use $options.cruds() { return CRUD(...) or [CRUD(...), ...] }')
+ }
+ return {
+ data() {
+ // 在data中返回crud,是为了将crud与当前实例关联,组件观测crud相关属性变化
+ return {
+ crud: this.crud
+ }
+ },
+ beforeCreate() {
+ this.$crud = this.$crud || {}
+ let cruds = this.$options.cruds instanceof Function ? this.$options.cruds() : crud
+ if (!(cruds instanceof Array)) {
+ cruds = [cruds]
+ }
+ cruds.forEach(ele => {
+ if (this.$crud[ele.tag]) {
+ console.error('[CRUD error]: ' + 'crud with tag [' + ele.tag + ' is already exist')
+ }
+ this.$crud[ele.tag] = ele
+ ele.registerVM('presenter', this, 0)
+ })
+ this.crud = this.$crud['defalut'] || cruds[0]
+ },
+ methods: {
+ parseTime
+ },
+ created() {
+ for (const k in this.$crud) {
+ if (this.$crud[k].queryOnPresenterCreated) {
+ this.$crud[k].toQuery()
+ }
+ }
+ },
+ destroyed() {
+ for (const k in this.$crud) {
+ this.$crud[k].unregisterVM('presenter', this)
+ }
+ },
+ mounted() {
+ // 如果table未实例化(例如使用了v-if),请稍后在适当时机crud.attchTable刷新table信息
+ if (this.$refs.table !== undefined) {
+ this.crud.attchTable()
+ }
+ }
+ }
+}
+
+/**
+ * 头部
+ */
+function header() {
+ return {
+ data() {
+ return {
+ crud: this.crud,
+ query: this.crud.query
+ }
+ },
+ beforeCreate() {
+ this.crud = lookupCrud(this)
+ this.crud.registerVM('header', this, 1)
+ },
+ destroyed() {
+ this.crud.unregisterVM('header', this)
+ }
+ }
+}
+
+/**
+ * 分页
+ */
+function pagination() {
+ return {
+ data() {
+ return {
+ crud: this.crud,
+ page: this.crud.page
+ }
+ },
+ beforeCreate() {
+ this.crud = lookupCrud(this)
+ this.crud.registerVM('pagination', this, 2)
+ },
+ destroyed() {
+ this.crud.unregisterVM('pagination', this)
+ }
+ }
+}
+
+/**
+ * 表单
+ */
+function form(defaultForm) {
+ return {
+ data() {
+ return {
+ crud: this.crud,
+ form: this.crud.form
+ }
+ },
+ beforeCreate() {
+ this.crud = lookupCrud(this)
+ this.crud.registerVM('form', this, 3)
+ },
+ created() {
+ this.crud.defaultForm = defaultForm
+ this.crud.resetForm()
+ },
+ destroyed() {
+ this.crud.unregisterVM('form', this)
+ }
+ }
+}
+
+/**
+ * crud
+ */
+function crud(options = {}) {
+ const defaultOptions = {
+ type: undefined
+ }
+ options = mergeOptions(defaultOptions, options)
+ return {
+ data() {
+ return {
+ crud: this.crud
+ }
+ },
+ beforeCreate() {
+ this.crud = lookupCrud(this)
+ this.crud.registerVM(options.type, this)
+ },
+ destroyed() {
+ this.crud.unregisterVM(options.type, this)
+ }
+ }
+}
+
+/**
+ * CRUD钩子
+ */
+CRUD.HOOK = {
+ /** 刷新 - 之前 */
+ beforeRefresh: 'beforeCrudRefresh',
+ /** 刷新 - 之后 */
+ afterRefresh: 'afterCrudRefresh',
+ /** 删除 - 之前 */
+ beforeDelete: 'beforeCrudDelete',
+ /** 删除 - 之后 */
+ afterDelete: 'afterCrudDelete',
+ /** 删除取消 - 之前 */
+ beforeDeleteCancel: 'beforeCrudDeleteCancel',
+ /** 删除取消 - 之后 */
+ afterDeleteCancel: 'afterCrudDeleteCancel',
+ /** 新建 - 之前 */
+ beforeToAdd: 'beforeCrudToAdd',
+ /** 新建 - 之后 */
+ afterToAdd: 'afterCrudToAdd',
+ /** 编辑 - 之前 */
+ beforeToEdit: 'beforeCrudToEdit',
+ /** 编辑 - 之后 */
+ afterToEdit: 'afterCrudToEdit',
+ /** 开始 "新建/编辑" - 之前 */
+ beforeToCU: 'beforeCrudToCU',
+ /** 开始 "新建/编辑" - 之后 */
+ afterToCU: 'afterCrudToCU',
+ /** "新建/编辑" 验证 - 之前 */
+ beforeValidateCU: 'beforeCrudValidateCU',
+ /** "新建/编辑" 验证 - 之后 */
+ afterValidateCU: 'afterCrudValidateCU',
+ /** 添加取消 - 之前 */
+ beforeAddCancel: 'beforeCrudAddCancel',
+ /** 添加取消 - 之后 */
+ afterAddCancel: 'afterCrudAddCancel',
+ /** 编辑取消 - 之前 */
+ beforeEditCancel: 'beforeCrudEditCancel',
+ /** 编辑取消 - 之后 */
+ afterEditCancel: 'afterCrudEditCancel',
+ /** 提交 - 之前 */
+ beforeSubmit: 'beforeCrudSubmitCU',
+ /** 提交 - 之后 */
+ afterSubmit: 'afterCrudSubmitCU',
+ afterAddError: 'afterCrudAddError',
+ afterEditError: 'afterCrudEditError',
+ afterToView: 'afterToView'
+}
+
+/**
+ * CRUD状态
+ */
+CRUD.STATUS = {
+ NORMAL: 0,
+ PREPARED: 1,
+ PROCESSING: 2
+}
+
+/**
+ * CRUD通知类型
+ */
+CRUD.NOTIFICATION_TYPE = {
+ SUCCESS: 'success',
+ WARNING: 'warning',
+ INFO: 'info',
+ ERROR: 'error'
+}
+
+export default CRUD
+
+export {
+ presenter,
+ header,
+ form,
+ pagination,
+ crud
+}
diff --git a/acs/nladmin-ui/src/components/DateRangePicker/index.vue b/acs/nladmin-ui/src/components/DateRangePicker/index.vue
new file mode 100644
index 0000000..749ced3
--- /dev/null
+++ b/acs/nladmin-ui/src/components/DateRangePicker/index.vue
@@ -0,0 +1,45 @@
+
diff --git a/acs/nladmin-ui/src/components/Dict/Dict.js b/acs/nladmin-ui/src/components/Dict/Dict.js
new file mode 100644
index 0000000..48554de
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Dict/Dict.js
@@ -0,0 +1,29 @@
+import Vue from 'vue'
+import { get as getDictDetail } from '@/api/system/dictDetail'
+
+export default class Dict {
+ constructor(dict) {
+ this.dict = dict
+ }
+
+ async init(names, completeCallback) {
+ if (names === undefined || name === null) {
+ throw new Error('need Dict names')
+ }
+ const ps = []
+ names.forEach(n => {
+ Vue.set(this.dict.dict, n, {})
+ Vue.set(this.dict.label, n, {})
+ Vue.set(this.dict, n, [])
+ ps.push(getDictDetail(n).then(data => {
+ this.dict[n].splice(0, 0, ...data.content)
+ data.content.forEach(d => {
+ Vue.set(this.dict.dict[n], d.value, d)
+ Vue.set(this.dict.label[n], d.value, d.label)
+ })
+ }))
+ })
+ await Promise.all(ps)
+ completeCallback()
+ }
+}
diff --git a/acs/nladmin-ui/src/components/Dict/index.js b/acs/nladmin-ui/src/components/Dict/index.js
new file mode 100644
index 0000000..0952f43
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Dict/index.js
@@ -0,0 +1,29 @@
+import Dict from './Dict'
+
+const install = function(Vue) {
+ Vue.mixin({
+ data() {
+ if (this.$options.dicts instanceof Array) {
+ const dict = {
+ dict: {},
+ label: {}
+ }
+ return {
+ dict
+ }
+ }
+ return {}
+ },
+ created() {
+ if (this.$options.dicts instanceof Array) {
+ new Dict(this.dict).init(this.$options.dicts, () => {
+ this.$nextTick(() => {
+ this.$emit('dictReady')
+ })
+ })
+ }
+ }
+ })
+}
+
+export default { install }
diff --git a/acs/nladmin-ui/src/components/Doc/index.vue b/acs/nladmin-ui/src/components/Doc/index.vue
new file mode 100644
index 0000000..92425e8
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Doc/index.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/BarChart.vue b/acs/nladmin-ui/src/components/Echarts/BarChart.vue
new file mode 100644
index 0000000..fa265ef
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/BarChart.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Category.vue b/acs/nladmin-ui/src/components/Echarts/Category.vue
new file mode 100644
index 0000000..5859114
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Category.vue
@@ -0,0 +1,438 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Funnel.vue b/acs/nladmin-ui/src/components/Echarts/Funnel.vue
new file mode 100644
index 0000000..380b373
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Funnel.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Gauge.vue b/acs/nladmin-ui/src/components/Echarts/Gauge.vue
new file mode 100644
index 0000000..40ce775
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Gauge.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Graph.vue b/acs/nladmin-ui/src/components/Echarts/Graph.vue
new file mode 100644
index 0000000..a5a88b3
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Graph.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/HeatMap.vue b/acs/nladmin-ui/src/components/Echarts/HeatMap.vue
new file mode 100644
index 0000000..6606278
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/HeatMap.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Line3D.vue b/acs/nladmin-ui/src/components/Echarts/Line3D.vue
new file mode 100644
index 0000000..c3f16f6
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Line3D.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/PieChart.vue b/acs/nladmin-ui/src/components/Echarts/PieChart.vue
new file mode 100644
index 0000000..ff1bc52
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/PieChart.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Point.vue b/acs/nladmin-ui/src/components/Echarts/Point.vue
new file mode 100644
index 0000000..5a6c777
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Point.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/RadarChart.vue b/acs/nladmin-ui/src/components/Echarts/RadarChart.vue
new file mode 100644
index 0000000..de70e52
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/RadarChart.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Rich.vue b/acs/nladmin-ui/src/components/Echarts/Rich.vue
new file mode 100644
index 0000000..1cf6bf2
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Rich.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Sankey.vue b/acs/nladmin-ui/src/components/Echarts/Sankey.vue
new file mode 100644
index 0000000..49968c4
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Sankey.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Scatter.vue b/acs/nladmin-ui/src/components/Echarts/Scatter.vue
new file mode 100644
index 0000000..b776efb
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Scatter.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/Sunburst.vue b/acs/nladmin-ui/src/components/Echarts/Sunburst.vue
new file mode 100644
index 0000000..fafc1a8
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/Sunburst.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/ThemeRiver.vue b/acs/nladmin-ui/src/components/Echarts/ThemeRiver.vue
new file mode 100644
index 0000000..967fc05
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/ThemeRiver.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Echarts/WordCloud.vue b/acs/nladmin-ui/src/components/Echarts/WordCloud.vue
new file mode 100644
index 0000000..415f2a8
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Echarts/WordCloud.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/GithubCorner/index.vue b/acs/nladmin-ui/src/components/GithubCorner/index.vue
new file mode 100644
index 0000000..fd77324
--- /dev/null
+++ b/acs/nladmin-ui/src/components/GithubCorner/index.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Hamburger/index.vue b/acs/nladmin-ui/src/components/Hamburger/index.vue
new file mode 100644
index 0000000..368b002
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Hamburger/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/HeaderSearch/index.vue b/acs/nladmin-ui/src/components/HeaderSearch/index.vue
new file mode 100644
index 0000000..c713efc
--- /dev/null
+++ b/acs/nladmin-ui/src/components/HeaderSearch/index.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/IconSelect/index.vue b/acs/nladmin-ui/src/components/IconSelect/index.vue
new file mode 100644
index 0000000..b0ec9fa
--- /dev/null
+++ b/acs/nladmin-ui/src/components/IconSelect/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/IconSelect/requireIcons.js b/acs/nladmin-ui/src/components/IconSelect/requireIcons.js
new file mode 100644
index 0000000..99e5c54
--- /dev/null
+++ b/acs/nladmin-ui/src/components/IconSelect/requireIcons.js
@@ -0,0 +1,11 @@
+
+const req = require.context('../../assets/icons/svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys()
+
+const re = /\.\/(.*)\.svg/
+
+const icons = requireAll(req).map(i => {
+ return i.match(re)[1]
+})
+
+export default icons
diff --git a/acs/nladmin-ui/src/components/Iframe/index.vue b/acs/nladmin-ui/src/components/Iframe/index.vue
new file mode 100644
index 0000000..9f395a3
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Iframe/index.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/JavaEdit/index.vue b/acs/nladmin-ui/src/components/JavaEdit/index.vue
new file mode 100644
index 0000000..c703829
--- /dev/null
+++ b/acs/nladmin-ui/src/components/JavaEdit/index.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Pagination/index.vue b/acs/nladmin-ui/src/components/Pagination/index.vue
new file mode 100644
index 0000000..c815e13
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Pagination/index.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/PanThumb/index.vue b/acs/nladmin-ui/src/components/PanThumb/index.vue
new file mode 100644
index 0000000..de6940a
--- /dev/null
+++ b/acs/nladmin-ui/src/components/PanThumb/index.vue
@@ -0,0 +1,140 @@
+
+
+
+
![]()
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/ParentView/index.vue b/acs/nladmin-ui/src/components/ParentView/index.vue
new file mode 100644
index 0000000..98240ae
--- /dev/null
+++ b/acs/nladmin-ui/src/components/ParentView/index.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/acs/nladmin-ui/src/components/Permission/index.js b/acs/nladmin-ui/src/components/Permission/index.js
new file mode 100644
index 0000000..e5dadd3
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Permission/index.js
@@ -0,0 +1,13 @@
+import permission from './permission'
+
+const install = function(Vue) {
+ Vue.directive('permission', permission)
+}
+
+if (window.Vue) {
+ window['permission'] = permission
+ Vue.use(install); // eslint-disable-line
+}
+
+permission.install = install
+export default permission
diff --git a/acs/nladmin-ui/src/components/Permission/permission.js b/acs/nladmin-ui/src/components/Permission/permission.js
new file mode 100644
index 0000000..ce66d11
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Permission/permission.js
@@ -0,0 +1,21 @@
+import store from '@/store'
+
+export default {
+ inserted(el, binding, vnode) {
+ const { value } = binding
+ const roles = store.getters && store.getters.roles
+ if (value && value instanceof Array && value.length > 0) {
+ const permissionRoles = value
+
+ const hasPermission = roles.some(role => {
+ return permissionRoles.includes(role)
+ })
+
+ if (!hasPermission) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ // throw new Error(`使用方式: v-permission="['admin','editor']"`)
+ }
+ }
+}
diff --git a/acs/nladmin-ui/src/components/RightPanel/index.vue b/acs/nladmin-ui/src/components/RightPanel/index.vue
new file mode 100644
index 0000000..b65ecec
--- /dev/null
+++ b/acs/nladmin-ui/src/components/RightPanel/index.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/Screenfull/index.vue b/acs/nladmin-ui/src/components/Screenfull/index.vue
new file mode 100644
index 0000000..260c90d
--- /dev/null
+++ b/acs/nladmin-ui/src/components/Screenfull/index.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/SizeSelect/index.vue b/acs/nladmin-ui/src/components/SizeSelect/index.vue
new file mode 100644
index 0000000..e490dce
--- /dev/null
+++ b/acs/nladmin-ui/src/components/SizeSelect/index.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+ {{
+ item.label }}
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/SvgIcon/index.vue b/acs/nladmin-ui/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..9a3318e
--- /dev/null
+++ b/acs/nladmin-ui/src/components/SvgIcon/index.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/ThemePicker/index.vue b/acs/nladmin-ui/src/components/ThemePicker/index.vue
new file mode 100644
index 0000000..2fc497b
--- /dev/null
+++ b/acs/nladmin-ui/src/components/ThemePicker/index.vue
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/TopNav/index.vue b/acs/nladmin-ui/src/components/TopNav/index.vue
new file mode 100644
index 0000000..c3b10a2
--- /dev/null
+++ b/acs/nladmin-ui/src/components/TopNav/index.vue
@@ -0,0 +1,198 @@
+
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+ 更多菜单
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/components/UploadExcel/index.vue b/acs/nladmin-ui/src/components/UploadExcel/index.vue
new file mode 100644
index 0000000..a78f966
--- /dev/null
+++ b/acs/nladmin-ui/src/components/UploadExcel/index.vue
@@ -0,0 +1,138 @@
+
+
+
+
+ 拖拽excel文件到此处 或者
+
+ 浏览
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/AppMain.vue b/acs/nladmin-ui/src/layout/components/AppMain.vue
new file mode 100644
index 0000000..92229f1
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/AppMain.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/InnerLink/index.vue b/acs/nladmin-ui/src/layout/components/InnerLink/index.vue
new file mode 100644
index 0000000..a45d1a4
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/InnerLink/index.vue
@@ -0,0 +1,27 @@
+
diff --git a/acs/nladmin-ui/src/layout/components/Navbar.vue b/acs/nladmin-ui/src/layout/components/Navbar.vue
new file mode 100644
index 0000000..a3347ee
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/Navbar.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/Settings/index.vue b/acs/nladmin-ui/src/layout/components/Settings/index.vue
new file mode 100644
index 0000000..5c23081
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/Settings/index.vue
@@ -0,0 +1,274 @@
+
+
+
+
+
+
主题风格设置
+
+
+
+

+
+
+
+

+
+
+
+
+
+ 主题颜色
+
+
+
+
+
+
+
系统布局配置
+
+
+ 开启 TopNav
+
+
+
+
+ 开启 Tags-Views
+
+
+
+
+ 固定 Header
+
+
+
+
+ 显示 Logo
+
+
+
+
+ 动态标题
+
+
+
+
+
+
保存配置
+
重置配置
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/Sidebar/FixiOSBug.js b/acs/nladmin-ui/src/layout/components/Sidebar/FixiOSBug.js
new file mode 100644
index 0000000..bc14856
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/Sidebar/FixiOSBug.js
@@ -0,0 +1,26 @@
+export default {
+ computed: {
+ device() {
+ return this.$store.state.app.device
+ }
+ },
+ mounted() {
+ // In order to fix the click on menu on the ios device will trigger the mouseleave bug
+ // https://github.com/PanJiaChen/vue-element-admin/issues/1135
+ this.fixBugIniOS()
+ },
+ methods: {
+ fixBugIniOS() {
+ const $subMenu = this.$refs.subMenu
+ if ($subMenu) {
+ const handleMouseleave = $subMenu.handleMouseleave
+ $subMenu.handleMouseleave = (e) => {
+ if (this.device === 'mobile') {
+ return
+ }
+ handleMouseleave(e)
+ }
+ }
+ }
+ }
+}
diff --git a/acs/nladmin-ui/src/layout/components/Sidebar/Item.vue b/acs/nladmin-ui/src/layout/components/Sidebar/Item.vue
new file mode 100644
index 0000000..b515f61
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/Sidebar/Item.vue
@@ -0,0 +1,29 @@
+
diff --git a/acs/nladmin-ui/src/layout/components/Sidebar/Link.vue b/acs/nladmin-ui/src/layout/components/Sidebar/Link.vue
new file mode 100644
index 0000000..eb4dd10
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/Sidebar/Link.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/Sidebar/Logo.vue b/acs/nladmin-ui/src/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000..bc2a53d
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/Sidebar/SidebarItem.vue b/acs/nladmin-ui/src/layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000..2d49dd8
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/Sidebar/index.vue b/acs/nladmin-ui/src/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..6a6d1da
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/Sidebar/index.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/TagsView/ScrollPane.vue b/acs/nladmin-ui/src/layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000..ba4840d
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/TagsView/index.vue b/acs/nladmin-ui/src/layout/components/TagsView/index.vue
new file mode 100644
index 0000000..aac4ec7
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/TagsView/index.vue
@@ -0,0 +1,328 @@
+
+
+
+
+ {{ tag.title }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/components/index.js b/acs/nladmin-ui/src/layout/components/index.js
new file mode 100644
index 0000000..104bd3a
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/components/index.js
@@ -0,0 +1,5 @@
+export { default as AppMain } from './AppMain'
+export { default as Navbar } from './Navbar'
+export { default as Settings } from './Settings'
+export { default as Sidebar } from './Sidebar/index.vue'
+export { default as TagsView } from './TagsView/index.vue'
diff --git a/acs/nladmin-ui/src/layout/index.vue b/acs/nladmin-ui/src/layout/index.vue
new file mode 100644
index 0000000..3187720
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/index.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/layout/mixin/ResizeHandler.js b/acs/nladmin-ui/src/layout/mixin/ResizeHandler.js
new file mode 100644
index 0000000..e8d0df8
--- /dev/null
+++ b/acs/nladmin-ui/src/layout/mixin/ResizeHandler.js
@@ -0,0 +1,45 @@
+import store from '@/store'
+
+const { body } = document
+const WIDTH = 992 // refer to Bootstrap's responsive design
+
+export default {
+ watch: {
+ $route(route) {
+ if (this.device === 'mobile' && this.sidebar.opened) {
+ store.dispatch('app/closeSideBar', { withoutAnimation: false })
+ }
+ }
+ },
+ beforeMount() {
+ window.addEventListener('resize', this.$_resizeHandler)
+ },
+ beforeDestroy() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ },
+ mounted() {
+ const isMobile = this.$_isMobile()
+ if (isMobile) {
+ store.dispatch('app/toggleDevice', 'mobile')
+ store.dispatch('app/closeSideBar', { withoutAnimation: true })
+ }
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_isMobile() {
+ const rect = body.getBoundingClientRect()
+ return rect.width - 1 < WIDTH
+ },
+ $_resizeHandler() {
+ if (!document.hidden) {
+ const isMobile = this.$_isMobile()
+ store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
+
+ if (isMobile) {
+ store.dispatch('app/closeSideBar', { withoutAnimation: true })
+ }
+ }
+ }
+ }
+}
diff --git a/acs/nladmin-ui/src/main.js b/acs/nladmin-ui/src/main.js
new file mode 100644
index 0000000..1fe4089
--- /dev/null
+++ b/acs/nladmin-ui/src/main.js
@@ -0,0 +1,84 @@
+import Vue from 'vue'
+import 'normalize.css/normalize.css'
+
+import Element from 'element-ui'
+
+import 'font-awesome/css/font-awesome.css'
+
+// vue中markdown编辑器
+import mavonEditor from 'mavon-editor'
+import 'mavon-editor/dist/css/index.css'
+
+// 数据字典
+import dict from './components/Dict'
+
+import scroll from 'vue-seamless-scroll'
+// 权限指令
+import permission from './components/Permission'
+import './assets/styles/element-variables.scss'
+// global css
+import './assets/styles/index.scss'
+
+// 代码高亮
+import VueHighlightJS from 'vue-highlightjs'
+import 'highlight.js/styles/atom-one-dark.css'
+
+import App from './App'
+import store from './store'
+import router from './router/routers'
+
+import './assets/icons' // icon
+import './router/index' // permission control
+import 'echarts-gl'
+
+import 'jquery'
+
+// 全局引入LogicFlow
+import LogicFlow from '@logicflow/core'
+import { Menu } from '@logicflow/extension'
+import '@logicflow/extension/lib/style/index.css'
+
+// Form Generator 组件需要使用到 tinymce
+import Tinymce from '@/views/system/build/tinymce/index.vue'
+import request from '@/utils/request' // 实现 form generator 使用自己定义的 axios request 对象
+
+import { addDateRange, handleTree, parseTime, resetForm, selectDictLabel, selectDictLabels, flexWidth } from '@/utils/nladmin'
+
+import { getValueByCode } from '@/api/system/param'
+
+LogicFlow.use(Menu)
+
+Vue.component('tinymce', Tinymce)
+Vue.prototype.$axios = request
+
+// 全局方法挂载
+Vue.prototype.parseTime = parseTime
+Vue.prototype.resetForm = resetForm
+Vue.prototype.addDateRange = addDateRange
+Vue.prototype.selectDictLabel = selectDictLabel
+Vue.prototype.selectDictLabels = selectDictLabels
+Vue.prototype.handleTree = handleTree
+Vue.prototype.getValueByCode = getValueByCode
+Vue.prototype.flexWidth = flexWidth
+
+Vue.use(scroll)
+
+Vue.use(VueHighlightJS)
+Vue.use(mavonEditor)
+Vue.use(permission)
+Vue.use(dict)
+// 全局设置控件样式https://codeantenna.com/a/0IN5FMJk5h
+Element.Table.props.border = { type: Boolean, default: true }
+Element.TableColumn.props.align = { type: String, default: 'center' }
+Vue.use(Element, {
+ size: 'mini' // set element-ui default size
+})
+
+Vue.config.productionTip = false
+
+new Vue({
+ el: '#app',
+ router,
+ store,
+ render: h => h(App)
+})
diff --git a/acs/nladmin-ui/src/mixins/crud.js b/acs/nladmin-ui/src/mixins/crud.js
new file mode 100644
index 0000000..0ccbde2
--- /dev/null
+++ b/acs/nladmin-ui/src/mixins/crud.js
@@ -0,0 +1,337 @@
+import {
+ initData,
+ download
+} from '@/api/data'
+import {
+ parseTime,
+ downloadFile
+} from '@/utils/index'
+import checkPermission from '@/utils/permission'
+
+export default {
+ data() {
+ return {
+ // 表格数据
+ data: [],
+ // 排序规则,默认 id 降序, 支持多字段排序 ['id,desc', 'createTime,asc']
+ sort: ['id,desc'],
+ // 页码
+ page: 0,
+ // 每页数据条数
+ size: 10,
+ // 总数据条数
+ total: 0,
+ // 请求数据的url
+ url: '',
+ // 查询数据的参数
+ params: {},
+ // 待查询的对象
+ query: {},
+ // 等待时间
+ time: 50,
+ // 是否为新增类型的表单
+ isAdd: false,
+ // 导出的 Loading
+ downloadLoading: false,
+ // 表格 Loading 属性
+ loading: true,
+ // 删除 Loading 属性
+ delLoading: false,
+ delAllLoading: false,
+ // 弹窗属性
+ dialog: false,
+ // Form 表单
+ form: {},
+ // 重置表单
+ resetForm: {},
+ // 标题
+ title: ''
+ }
+ },
+ methods: {
+ parseTime,
+ downloadFile,
+ checkPermission,
+ async init() {
+ if (!await this.beforeInit()) {
+ return
+ }
+ return new Promise((resolve, reject) => {
+ this.loading = true
+ // 请求数据
+ initData(this.url, this.getQueryParame()).then(data => {
+ this.total = data.totalElements
+ this.data = data.content
+ // time 毫秒后显示表格
+ setTimeout(() => {
+ this.loading = false
+ }, this.time)
+ resolve(data)
+ }).catch(err => {
+ this.loading = false
+ reject(err)
+ })
+ })
+ },
+ beforeInit() {
+ return true
+ },
+ getQueryParame: function() {
+ return {
+ page: this.page,
+ size: this.size,
+ sort: this.sort,
+ ...this.query,
+ ...this.params
+ }
+ },
+ // 改变页码
+ pageChange(e) {
+ this.page = e - 1
+ this.init()
+ },
+ // 改变每页显示数
+ sizeChange(e) {
+ this.page = 0
+ this.size = e
+ this.init()
+ },
+ // 预防删除第二页最后一条数据时,或者多选删除第二页的数据时,页码错误导致请求无数据
+ dleChangePage(size) {
+ if (size === undefined) {
+ size = 1
+ }
+ if (this.data.length === size && this.page !== 0) {
+ this.page = this.page - 1
+ }
+ },
+ // 查询方法
+ toQuery() {
+ this.page = 0
+ this.init()
+ },
+ /**
+ * 通用的提示封装
+ */
+ submitSuccessNotify() {
+ this.$notify({
+ title: '提交成功',
+ type: 'success',
+ duration: 2500
+ })
+ },
+ addSuccessNotify() {
+ this.$notify({
+ title: '新增成功',
+ type: 'success',
+ duration: 2500
+ })
+ },
+ editSuccessNotify() {
+ this.$notify({
+ title: '编辑成功',
+ type: 'success',
+ duration: 2500
+ })
+ },
+ delSuccessNotify() {
+ this.$notify({
+ title: '删除成功',
+ type: 'success',
+ duration: 2500
+ })
+ },
+ notify(title, type) {
+ this.$notify({
+ title: title,
+ type: type,
+ duration: 2500
+ })
+ },
+ /**
+ * 删除前可以调用 beforeDelMethod 做一些操作
+ */
+ beforeDelMethod() {
+ return true
+ },
+ /**
+ * 通用的删除
+ */
+ delMethod(id) {
+ if (!this.beforeDelMethod()) {
+ return
+ }
+ this.delLoading = true
+ this.crudMethod.del(id).then(() => {
+ this.delLoading = false
+ this.$refs[id].doClose()
+ this.dleChangePage()
+ this.delSuccessNotify()
+ this.afterDelMethod()
+ this.init()
+ }).catch(() => {
+ this.delLoading = false
+ this.$refs[id].doClose()
+ })
+ },
+ afterDelMethod() {},
+ /**
+ * 多选删除提示
+ */
+ beforeDelAllMethod() {
+ this.$confirm('你确定删除选中的数据吗?', '提示', {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }).then(() => {
+ this.delAllMethod()
+ })
+ },
+ /**
+ * 多选删除
+ */
+ delAllMethod() {
+ this.delAllLoading = true
+ const data = this.$refs.table.selection
+ const ids = []
+ for (let i = 0; i < data.length; i++) {
+ ids.push(data[i].id)
+ }
+ this.crudMethod.delAll(ids).then(() => {
+ this.delAllLoading = false
+ this.dleChangePage(ids.length)
+ this.init()
+ this.$notify({
+ title: '删除成功',
+ type: 'success',
+ duration: 2500
+ })
+ }).catch(() => {
+ this.delAllLoading = false
+ })
+ },
+ /**
+ * 显示新增弹窗前可以调用该方法
+ */
+ beforeShowAddForm() {},
+ /**
+ * 显示新增弹窗
+ */
+ showAddFormDialog() {
+ this.isAdd = true
+ this.resetForm = JSON.parse(JSON.stringify(this.form))
+ this.beforeShowAddForm()
+ this.dialog = true
+ },
+ /**
+ * 显示编辑弹窗前可以调用该方法
+ */
+ beforeShowEditForm(data) {},
+ /**
+ * 显示编辑弹窗
+ */
+ showEditFormDialog(data = '') {
+ this.isAdd = false
+ if (data) {
+ this.resetForm = JSON.parse(JSON.stringify(this.form))
+ this.form = JSON.parse(JSON.stringify(data))
+ }
+ this.beforeShowEditForm(data)
+ this.dialog = true
+ },
+ /**
+ * 新增方法
+ */
+ addMethod() {
+ this.crudMethod.add(this.form).then(() => {
+ this.addSuccessNotify()
+ this.loading = false
+ this.afterAddMethod()
+ this.cancel()
+ this.init()
+ }).catch(() => {
+ this.loading = false
+ this.afterAddErrorMethod()
+ })
+ },
+ /**
+ * 新增后可以调用该方法
+ */
+ afterAddMethod() {},
+ /**
+ * 新增失败后调用该方法
+ */
+ afterAddErrorMethod() {},
+ /**
+ * 通用的编辑方法
+ */
+ editMethod() {
+ this.crudMethod.edit(this.form).then(() => {
+ this.editSuccessNotify()
+ this.loading = false
+ this.afterEditMethod()
+ this.cancel()
+ this.init()
+ }).catch(() => {
+ this.loading = false
+ })
+ },
+ /**
+ * 编辑后可以调用该方法
+ */
+ afterEditMethod() {},
+ /**
+ * 提交前可以调用该方法
+ */
+ beforeSubmitMethod() {
+ return true
+ },
+ /**
+ * 提交
+ */
+ submitMethod() {
+ if (!this.beforeSubmitMethod()) {
+ return
+ }
+ if (this.$refs['form']) {
+ this.$refs['form'].validate((valid) => {
+ if (valid) {
+ this.loading = true
+ if (this.isAdd) {
+ this.addMethod()
+ } else this.editMethod()
+ }
+ })
+ }
+ },
+ /**
+ * 隐藏弹窗
+ */
+ cancel() {
+ this.dialog = false
+ if (this.$refs['form']) {
+ this.$refs['form'].clearValidate()
+ this.form = this.resetForm
+ }
+ },
+ /**
+ * 获取弹窗的标题
+ */
+ getFormTitle() {
+ return this.isAdd ? `新增${this.title}` : `编辑${this.title}`
+ },
+ /**
+ * 通用导出
+ */
+ downloadMethod() {
+ this.beforeInit()
+ this.downloadLoading = true
+ download(this.url + '/download', this.params).then(result => {
+ this.downloadFile(result, this.title + '数据', 'xlsx')
+ this.downloadLoading = false
+ }).catch(() => {
+ this.downloadLoading = false
+ })
+ }
+ }
+}
diff --git a/acs/nladmin-ui/src/router/index.js b/acs/nladmin-ui/src/router/index.js
new file mode 100644
index 0000000..2bc3d90
--- /dev/null
+++ b/acs/nladmin-ui/src/router/index.js
@@ -0,0 +1,73 @@
+import router from './routers'
+import store from '@/store'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+import { getToken } from '@/utils/auth' // getToken from cookie
+import { buildMenus } from '@/api/system/menu'
+import { filterAsyncRouter } from '@/store/modules/permission'
+
+NProgress.configure({ showSpinner: false })// NProgress Configuration
+
+const whiteList = ['/login', '/expand']// no redirect whitelist
+
+router.beforeEach((to, from, next) => {
+ if (to.meta.title) {
+ // document.title = to.meta.title + ' - ' + Config.title
+ document.title = to.meta.title
+ }
+ NProgress.start()
+ if (getToken()) {
+ // debugger
+ // 已登录且要跳转的页面是登录页
+ if (to.path === '/login') {
+ next({ path: '/' })
+ NProgress.done()
+ } else {
+ if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息
+ store.dispatch('GetInfo').then(() => { // 拉取user_info
+ // 动态路由,拉取菜单
+ loadMenus(next, to)
+ }).catch(() => {
+ store.dispatch('LogOut').then(() => {
+ location.reload() // 为了重新实例化vue-router对象 避免bug
+ })
+ })
+ // 登录时未拉取 菜单,在此处拉取
+ } else if (store.getters.loadMenus) {
+ // 修改成false,防止死循环
+ store.dispatch('updateLoadMenus')
+ loadMenus(next, to)
+ } else {
+ next()
+ }
+ }
+ } else {
+ /* has no token*/
+ if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入
+ next()
+ } else {
+ next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
+ NProgress.done()
+ }
+ }
+})
+
+export const loadMenus = (next, to) => {
+ buildMenus().then(res => {
+ const sdata = JSON.parse(JSON.stringify(res))
+ const rdata = JSON.parse(JSON.stringify(res))
+ const sidebarRoutes = filterAsyncRouter(sdata)
+ const rewriteRoutes = filterAsyncRouter(rdata, false, true)
+ rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
+
+ store.dispatch('GenerateRoutes', rewriteRoutes).then(() => { // 存储路由
+ router.addRoutes(rewriteRoutes) // 动态添加可访问路由表
+ next({ ...to, replace: true })
+ })
+ store.dispatch('SetSidebarRouters', sidebarRoutes)
+ })
+}
+
+router.afterEach(() => {
+ NProgress.done() // finish progress bar
+})
diff --git a/acs/nladmin-ui/src/router/routers.js b/acs/nladmin-ui/src/router/routers.js
new file mode 100644
index 0000000..07be08d
--- /dev/null
+++ b/acs/nladmin-ui/src/router/routers.js
@@ -0,0 +1,69 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import Layout from '../layout/index'
+
+Vue.use(Router)
+
+export const constantRouterMap = [
+ {
+ path: '/login',
+ meta: { title: '登录', noCache: true },
+ component: (resolve) => require(['@/views/login'], resolve),
+ hidden: true
+ },
+ {
+ path: '/404',
+ component: (resolve) => require(['@/views/features/404'], resolve),
+ hidden: true
+ },
+ {
+ path: '/401',
+ component: (resolve) => require(['@/views/features/401'], resolve),
+ hidden: true
+ },
+ {
+ path: '/redirect',
+ component: Layout,
+ hidden: true,
+ children: [
+ {
+ path: '/redirect/:path*',
+ component: (resolve) => require(['@/views/features/redirect'], resolve)
+ }
+ ]
+ },
+ {
+ path: '/',
+ component: Layout,
+ redirect: '/dashboard',
+ children: [
+ {
+ path: 'dashboard',
+ component: (resolve) => require(['@/views/monitor/server/index'], resolve),
+ name: 'Dashboard',
+ meta: { title: '首页', icon: 'index', affix: true, noCache: true }
+ }
+ ]
+ },
+ {
+ path: '/user',
+ component: Layout,
+ hidden: true,
+ redirect: 'noredirect',
+ children: [
+ {
+ path: 'center',
+ component: (resolve) => require(['@/views/system/user/center'], resolve),
+ name: '个人中心',
+ meta: { title: '个人中心' }
+ }
+ ]
+ }
+]
+
+export default new Router({
+ // mode: 'hash',
+ mode: 'history',
+ scrollBehavior: () => ({ y: 0 }),
+ routes: constantRouterMap
+})
diff --git a/acs/nladmin-ui/src/settings.js b/acs/nladmin-ui/src/settings.js
new file mode 100644
index 0000000..91fbaf4
--- /dev/null
+++ b/acs/nladmin-ui/src/settings.js
@@ -0,0 +1,64 @@
+module.exports = {
+ /**
+ * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
+ */
+ sideTheme: 'theme-dark',
+
+ /**
+ * 是否系统布局配置
+ */
+ showSettings: false,
+
+ /**
+ * 是否显示顶部导航
+ */
+ topNav: false,
+ /**
+ * @description 网站标题
+ */
+ title: 'EL-ADMIN',
+ /**
+ * @description 是否显示 tagsView
+ */
+ tagsView: true,
+ /**
+ * @description 固定头部
+ */
+ fixedHeader: true,
+ /**
+ * @description 记住密码状态下的token在Cookie中存储的天数,默认1天
+ */
+ tokenCookieExpires: 1,
+ /**
+ * @description 记住密码状态下的密码在Cookie中存储的天数,默认1天s
+ */
+ passCookieExpires: 1,
+ /**
+ * @description 是否只保持一个子菜单的展开
+ */
+ uniqueOpened: true,
+ /**
+ * @description token key
+ */
+ TokenKey: 'NL-ACS-TOEKN',
+ /**
+ * @description 请求超时时间,毫秒(默认2分钟)
+ */
+ timeout: 1200000,
+ /**
+ * @description 是否显示logo
+ */
+ sidebarLogo: true,
+ /**
+ * 是否显示设置的底部信息
+ */
+ showFooter: false,
+ /**
+ * 底部文字,支持html语法
+ */
+ footerTxt: '© 2019 Zheng Jie Apache License 2.0',
+ /**
+ * 备案号
+ */
+ caseNumber: '浙ICP备18005431号'
+}
diff --git a/acs/nladmin-ui/src/store/getters.js b/acs/nladmin-ui/src/store/getters.js
new file mode 100644
index 0000000..3c9ec20
--- /dev/null
+++ b/acs/nladmin-ui/src/store/getters.js
@@ -0,0 +1,26 @@
+const getters = {
+ deployUploadApi: state => state.api.deployUploadApi,
+ databaseUploadApi: state => state.api.databaseUploadApi,
+ size: state => state.app.size,
+ sidebar: state => state.app.sidebar,
+ device: state => state.app.device,
+ token: state => state.user.token,
+ visitedViews: state => state.tagsView.visitedViews,
+ cachedViews: state => state.tagsView.cachedViews,
+ roles: state => state.user.roles,
+ user: state => state.user.user,
+ loadMenus: state => state.user.loadMenus,
+ permission_routers: state => state.permission.routers,
+ addRouters: state => state.permission.addRouters,
+ socketApi: state => state.api.socketApi,
+ imagesUploadApi: state => state.api.imagesUploadApi,
+ baseApi: state => state.api.baseApi,
+ fileUploadApi: state => state.api.fileUploadApi,
+ updateAvatarApi: state => state.api.updateAvatarApi,
+ qiNiuUploadApi: state => state.api.qiNiuUploadApi,
+ sqlApi: state => state.api.sqlApi,
+ swaggerApi: state => state.api.swaggerApi,
+ sidebarRouters: state => state.permission.sidebarRouters,
+ topbarRouters: state => state.permission.topbarRouters
+}
+export default getters
diff --git a/acs/nladmin-ui/src/store/index.js b/acs/nladmin-ui/src/store/index.js
new file mode 100644
index 0000000..0fd8395
--- /dev/null
+++ b/acs/nladmin-ui/src/store/index.js
@@ -0,0 +1,25 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+// https://webpack.js.org/guides/dependency-management/#requirecontext
+const modulesFiles = require.context('./modules', true, /\.js$/)
+
+// you do not need `import app from './modules/app'`
+// it will auto require all vuex module from modules file
+const modules = modulesFiles.keys().reduce((modules, modulePath) => {
+ // set './app.js' => 'app'
+ const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
+ const value = modulesFiles(modulePath)
+ modules[moduleName] = value.default
+ return modules
+}, {})
+
+const store = new Vuex.Store({
+ modules,
+ getters
+})
+
+export default store
diff --git a/acs/nladmin-ui/src/store/modules/api.js b/acs/nladmin-ui/src/store/modules/api.js
new file mode 100644
index 0000000..212f1eb
--- /dev/null
+++ b/acs/nladmin-ui/src/store/modules/api.js
@@ -0,0 +1,29 @@
+// 适配 Nginx 反向代理
+const baseUrl = process.env.VUE_APP_BASE_API === '/' ? '' : process.env.VUE_APP_BASE_API
+
+const api = {
+ state: {
+ // 部署包上传
+ deployUploadApi: baseUrl + '/api/deploy/upload',
+ // SQL脚本上传
+ databaseUploadApi: baseUrl + '/api/database/upload',
+ // 实时控制台
+ socketApi: baseUrl + '/websocket?token=kl',
+ // 图片上传
+ imagesUploadApi: baseUrl + '/api/localStorage/pictures',
+ // 修改头像
+ updateAvatarApi: baseUrl + '/api/users/updateAvatar',
+ // 上传文件到七牛云
+ qiNiuUploadApi: baseUrl + '/api/qiNiuContent',
+ // Sql 监控
+ sqlApi: baseUrl + '/druid/index.html',
+ // swagger
+ swaggerApi: baseUrl + '/swagger-ui.html',
+ // 文件上传
+ fileUploadApi: baseUrl + '/api/localStorage',
+ // baseUrl,
+ baseApi: baseUrl
+ }
+}
+
+export default api
diff --git a/acs/nladmin-ui/src/store/modules/app.js b/acs/nladmin-ui/src/store/modules/app.js
new file mode 100644
index 0000000..a384479
--- /dev/null
+++ b/acs/nladmin-ui/src/store/modules/app.js
@@ -0,0 +1,56 @@
+import Cookies from 'js-cookie'
+
+const state = {
+ sidebar: {
+ opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+ withoutAnimation: false
+ },
+ device: 'desktop',
+ size: Cookies.get('size') || 'small'
+}
+
+const mutations = {
+ TOGGLE_SIDEBAR: state => {
+ state.sidebar.opened = !state.sidebar.opened
+ state.sidebar.withoutAnimation = false
+ if (state.sidebar.opened) {
+ Cookies.set('sidebarStatus', 1)
+ } else {
+ Cookies.set('sidebarStatus', 0)
+ }
+ },
+ CLOSE_SIDEBAR: (state, withoutAnimation) => {
+ Cookies.set('sidebarStatus', 0)
+ state.sidebar.opened = false
+ state.sidebar.withoutAnimation = withoutAnimation
+ },
+ TOGGLE_DEVICE: (state, device) => {
+ state.device = device
+ },
+ SET_SIZE: (state, size) => {
+ state.size = size
+ Cookies.set('size', size)
+ }
+}
+
+const actions = {
+ toggleSideBar({ commit }) {
+ commit('TOGGLE_SIDEBAR')
+ },
+ closeSideBar({ commit }, { withoutAnimation }) {
+ commit('CLOSE_SIDEBAR', withoutAnimation)
+ },
+ toggleDevice({ commit }, device) {
+ commit('TOGGLE_DEVICE', device)
+ },
+ setSize({ commit }, size) {
+ commit('SET_SIZE', size)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/acs/nladmin-ui/src/store/modules/permission.js b/acs/nladmin-ui/src/store/modules/permission.js
new file mode 100644
index 0000000..94efb99
--- /dev/null
+++ b/acs/nladmin-ui/src/store/modules/permission.js
@@ -0,0 +1,93 @@
+import { constantRouterMap } from '@/router/routers'
+import Layout from '@/layout/index'
+import ParentView from '@/components/ParentView'
+
+const permission = {
+ state: {
+ routers: constantRouterMap,
+ addRouters: [],
+ topbarRouters: [],
+ sidebarRouters: []
+ },
+ mutations: {
+ SET_ROUTERS: (state, routers) => {
+ state.addRouters = routers
+ state.routers = constantRouterMap.concat(routers)
+ },
+ SET_TOPBAR_ROUTES: (state, routes) => {
+ // 顶部导航菜单默认添加统计报表栏指向首页
+ const index = [{
+ path: 'index',
+ meta: { title: '统计报表', icon: 'dashboard' }
+ }]
+ state.topbarRouters = routes.concat(index)
+ },
+ SET_SIDEBAR_ROUTERS: (state, routers) => {
+ state.sidebarRouters = constantRouterMap.concat(routers)
+ }
+ },
+ actions: {
+ GenerateRoutes({ commit }, asyncRouter) {
+ commit('SET_ROUTERS', asyncRouter)
+ },
+ SetSidebarRouters({ commit }, sidebarRouter) {
+ commit('SET_TOPBAR_ROUTES', sidebarRouter)
+ commit('SET_SIDEBAR_ROUTERS', sidebarRouter)
+ }
+ }
+}
+
+export const filterAsyncRouter = (routers, lastRouter = false, type = false) => { // 遍历后台传来的路由字符串,转换为组件对象
+ return routers.filter(router => {
+ if (type && router.children) {
+ router.children = filterChildren(router.children)
+ }
+ if (router.component) {
+ if (router.component === 'Layout') { // Layout组件特殊处理
+ router.component = Layout
+ } else if (router.component === 'ParentView') {
+ router.component = ParentView
+ } else {
+ const component = router.component
+ router.component = loadView(component)
+ }
+ }
+ if (router.children != null && router.children && router.children.length) {
+ router.children = filterAsyncRouter(router.children, router, type)
+ } else {
+ delete router['children']
+ delete router['redirect']
+ }
+ return true
+ })
+}
+
+function filterChildren(childrenMap, lastRouter = false) {
+ var children = []
+ childrenMap.forEach((el, index) => {
+ if (el.children && el.children.length) {
+ if (el.component === 'ParentView') {
+ el.children.forEach(c => {
+ c.path = el.path + '/' + c.path
+ if (c.children && c.children.length) {
+ children = children.concat(filterChildren(c.children, c))
+ return
+ }
+ children.push(c)
+ })
+ return
+ }
+ }
+ if (lastRouter) {
+ el.path = lastRouter.path + '/' + el.path
+ }
+ children = children.concat(el)
+ })
+ return children
+}
+
+export const loadView = (view) => {
+ return (resolve) => require([`@/views/${view}`], resolve)
+}
+
+export default permission
diff --git a/acs/nladmin-ui/src/store/modules/settings.js b/acs/nladmin-ui/src/store/modules/settings.js
new file mode 100644
index 0000000..d61514a
--- /dev/null
+++ b/acs/nladmin-ui/src/store/modules/settings.js
@@ -0,0 +1,47 @@
+import defaultSettings from '@/settings'
+
+const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, uniqueOpened, showFooter, footerTxt, caseNumber } = defaultSettings
+
+// const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
+const storageSetting = JSON.stringify(localStorage.getItem('layout-setting')) || ''
+const state = {
+ title: '',
+ theme: storageSetting.theme || '#409EFF',
+ sideTheme: storageSetting.sideTheme || sideTheme,
+ showSettings: showSettings,
+ topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
+ tagsView: tagsView,
+ fixedHeader: fixedHeader,
+ sidebarLogo: sidebarLogo,
+ uniqueOpened: uniqueOpened,
+ showFooter: showFooter,
+ footerTxt: footerTxt,
+ caseNumber: caseNumber
+
+}
+
+const mutations = {
+ CHANGE_SETTING: (state, { key, value }) => {
+ if (state.hasOwnProperty(key)) {
+ state[key] = value
+ }
+ }
+}
+
+const actions = {
+ changeSetting({ commit }, data) {
+ commit('CHANGE_SETTING', data)
+ },
+ // 设置网页标题
+ setTitle({ commit }, title) {
+ state.title = title
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
+
diff --git a/acs/nladmin-ui/src/store/modules/tagsView.js b/acs/nladmin-ui/src/store/modules/tagsView.js
new file mode 100644
index 0000000..3e2c170
--- /dev/null
+++ b/acs/nladmin-ui/src/store/modules/tagsView.js
@@ -0,0 +1,165 @@
+const state = {
+ visitedViews: [],
+ cachedViews: []
+}
+
+const mutations = {
+ ADD_VISITED_VIEW: (state, view) => {
+ if (state.visitedViews.some(v => v.path === view.path)) return
+ state.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ ADD_CACHED_VIEW: (state, view) => {
+ if (state.cachedViews.includes(view.name)) return
+ if (!view.meta.noCache) {
+ state.cachedViews.push(view.name)
+ }
+ },
+
+ DEL_VISITED_VIEW: (state, view) => {
+ for (const [i, v] of state.visitedViews.entries()) {
+ if (v.path === view.path) {
+ state.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ },
+ DEL_CACHED_VIEW: (state, view) => {
+ for (const i of state.cachedViews) {
+ if (i === view.name) {
+ const index = state.cachedViews.indexOf(i)
+ state.cachedViews.splice(index, 1)
+ break
+ }
+ }
+ },
+
+ DEL_OTHERS_VISITED_VIEWS: (state, view) => {
+ state.visitedViews = state.visitedViews.filter(v => {
+ return v.meta.affix || v.path === view.path
+ })
+ },
+ DEL_OTHERS_CACHED_VIEWS: (state, view) => {
+ for (const i of state.cachedViews) {
+ if (i === view.name) {
+ const index = state.cachedViews.indexOf(i)
+ state.cachedViews = state.cachedViews.slice(index, index + 1)
+ break
+ }
+ }
+ },
+
+ DEL_ALL_VISITED_VIEWS: state => {
+ // keep affix tags
+ const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
+ state.visitedViews = affixTags
+ },
+ DEL_ALL_CACHED_VIEWS: state => {
+ state.cachedViews = []
+ },
+
+ UPDATE_VISITED_VIEW: (state, view) => {
+ for (let v of state.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ }
+}
+
+const actions = {
+ addView({ dispatch }, view) {
+ dispatch('addVisitedView', view)
+ dispatch('addCachedView', view)
+ },
+ addVisitedView({ commit }, view) {
+ commit('ADD_VISITED_VIEW', view)
+ },
+ addCachedView({ commit }, view) {
+ commit('ADD_CACHED_VIEW', view)
+ },
+
+ delView({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delVisitedView', view)
+ dispatch('delCachedView', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delVisitedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_VISITED_VIEW', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delCachedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_CACHED_VIEW', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delOthersViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delOthersVisitedViews', view)
+ dispatch('delOthersCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delOthersVisitedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_VISITED_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delOthersCachedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_CACHED_VIEWS', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delAllViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delAllVisitedViews', view)
+ dispatch('delAllCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delAllVisitedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_VISITED_VIEWS')
+ resolve([...state.visitedViews])
+ })
+ },
+ delAllCachedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_CACHED_VIEWS')
+ resolve([...state.cachedViews])
+ })
+ },
+
+ updateVisitedView({ commit }, view) {
+ commit('UPDATE_VISITED_VIEW', view)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/acs/nladmin-ui/src/store/modules/user.js b/acs/nladmin-ui/src/store/modules/user.js
new file mode 100644
index 0000000..10d2375
--- /dev/null
+++ b/acs/nladmin-ui/src/store/modules/user.js
@@ -0,0 +1,96 @@
+import { login, getInfo, logout } from '@/api/login'
+import { getToken, setToken, removeToken } from '@/utils/auth'
+
+const user = {
+ state: {
+ token: getToken(),
+ user: {},
+ roles: [],
+ // 第一次加载菜单时用到
+ loadMenus: false
+ },
+
+ mutations: {
+ SET_TOKEN: (state, token) => {
+ state.token = token
+ },
+ SET_USER: (state, user) => {
+ state.user = user
+ },
+ SET_ROLES: (state, roles) => {
+ state.roles = roles
+ },
+ SET_LOAD_MENUS: (state, loadMenus) => {
+ state.loadMenus = loadMenus
+ }
+ },
+
+ actions: {
+ // 登录
+ Login({ commit }, userInfo) {
+ const rememberMe = userInfo.rememberMe
+ return new Promise((resolve, reject) => {
+ login(userInfo.username, userInfo.password, userInfo.code, userInfo.uuid).then(res => {
+ console.log('登录信息:', res)
+ setToken(res.token, rememberMe)
+ commit('SET_TOKEN', res.token)
+ setUserInfo(res.user, commit)
+ // 第一次加载菜单时用到, 具体见 src 目录下的 permission.js
+ commit('SET_LOAD_MENUS', true)
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // 获取用户信息
+ GetInfo({ commit }) {
+ return new Promise((resolve, reject) => {
+ getInfo().then(res => {
+ console.log('用户信息:', res)
+ setUserInfo(res, commit)
+ resolve(res)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+ // 登出
+ LogOut({ commit }) {
+ return new Promise((resolve, reject) => {
+ logout().then(res => {
+ logOut(commit)
+ resolve()
+ }).catch(error => {
+ logOut(commit)
+ reject(error)
+ })
+ })
+ },
+
+ updateLoadMenus({ commit }) {
+ return new Promise((resolve, reject) => {
+ commit('SET_LOAD_MENUS', false)
+ })
+ }
+ }
+}
+
+export const logOut = (commit) => {
+ commit('SET_TOKEN', '')
+ commit('SET_ROLES', [])
+ removeToken()
+}
+
+export const setUserInfo = (res, commit) => {
+ // 如果没有任何权限,则赋予一个默认的权限,避免请求死循环
+ if (res.roles.length === 0) {
+ commit('SET_ROLES', ['ROLE_SYSTEM_DEFAULT'])
+ } else {
+ commit('SET_ROLES', res.roles)
+ }
+ commit('SET_USER', res.user)
+}
+
+export default user
diff --git a/acs/nladmin-ui/src/utils/auth.js b/acs/nladmin-ui/src/utils/auth.js
new file mode 100644
index 0000000..b643e73
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/auth.js
@@ -0,0 +1,18 @@
+import Cookies from 'js-cookie'
+import Config from '@/settings'
+
+const TokenKey = Config.TokenKey
+
+export function getToken() {
+ return Cookies.get(TokenKey)
+}
+
+export function setToken(token, rememberMe) {
+ if (rememberMe) {
+ return Cookies.set(TokenKey, token, { expires: Config.tokenCookieExpires })
+ } else return Cookies.set(TokenKey, token)
+}
+
+export function removeToken() {
+ return Cookies.remove(TokenKey)
+}
diff --git a/acs/nladmin-ui/src/utils/clipboard.js b/acs/nladmin-ui/src/utils/clipboard.js
new file mode 100644
index 0000000..e916a44
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/clipboard.js
@@ -0,0 +1,36 @@
+import Vue from 'vue'
+import Clipboard from 'clipboard'
+
+function clipboardSuccess() {
+ Vue.prototype.$message({
+ message: 'Copy successfully',
+ type: 'success',
+ duration: 1500
+ })
+}
+
+function clipboardError() {
+ Vue.prototype.$message({
+ message: 'Copy failed',
+ type: 'error'
+ })
+}
+
+export default function handleClipboard(text, event) {
+ const clipboard = new Clipboard(event.target, {
+ text: () => text
+ })
+ clipboard.on('success', () => {
+ clipboardSuccess()
+ clipboard.off('error')
+ clipboard.off('success')
+ clipboard.destroy()
+ })
+ clipboard.on('error', () => {
+ clipboardError()
+ clipboard.off('error')
+ clipboard.off('success')
+ clipboard.destroy()
+ })
+ clipboard.onClick(event)
+}
diff --git a/acs/nladmin-ui/src/utils/datetime.js b/acs/nladmin-ui/src/utils/datetime.js
new file mode 100644
index 0000000..67f808a
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/datetime.js
@@ -0,0 +1,216 @@
+/* eslint-disable */
+
+/**
+ * Date对象的补充函数,包括类似Python中的strftime()
+ * 阿债 https://gitee.com/azhai/datetime.js
+ */
+
+Date.prototype.toMidnight = function() {
+ this.setHours(0)
+ this.setMinutes(0)
+ this.setSeconds(0)
+ this.setMilliseconds(0)
+ return this
+}
+
+Date.prototype.daysAgo = function(days, midnight) {
+ days = days ? days - 0 : 0
+ const date = new Date(this.getTime() - days * 8.64E7)
+ return midnight ? date.toMidnight() : date
+}
+
+Date.prototype.monthBegin = function(offset) {
+ offset = offset ? offset - 0 : 0
+ const days = this.getDate() - 1 - offset
+ return this.daysAgo(days, true)
+}
+
+Date.prototype.quarterBegin = function() {
+ const month = this.getMonth() - this.getMonth() % 3
+ return new Date(this.getFullYear(), month, 1).toMidnight()
+}
+
+Date.prototype.yearBegin = function() {
+ return new Date(this.getFullYear(), 0, 1).toMidnight()
+}
+
+Date.prototype.strftime = function(format, local) {
+ if (!format) {
+ const str = new Date(this.getTime() + 2.88E7).toISOString()
+ return str.substr(0, 16).replace('T', ' ')
+ }
+ local = local && local.startsWith('zh') ? 'zh' : 'en'
+ const padZero = function(str, len) {
+ const pads = len - str.toString().length
+ return (pads && pads > 0 ? '0'.repeat(pads) : '') + str
+ }
+ format = format.replace('%F', '%Y-%m-%d')
+ format = format.replace(/%D|%x/, '%m/%d/%y')
+ format = format.replace(/%T|%X/, '%H:%M:%S')
+ format = format.replace('%R', '%H:%M')
+ format = format.replace('%r', '%H:%M:%S %p')
+ format = format.replace('%c', '%a %b %e %H:%M:%S %Y')
+ const _this = this
+ return format.replace(/%[A-Za-z%]/g, function(f) {
+ let ans = f
+ switch (f) {
+ case '%%':
+ ans = '%'
+ break
+
+ case '%Y':
+ case '%G':
+ ans = _this.getFullYear()
+ break
+
+ case '%y':
+ ans = _this.getFullYear() % 100
+ break
+
+ case '%C':
+ ans = _this.getFullYear() / 100
+ break
+
+ case '%m':
+ case '%n':
+ ans = _this.getMonth() + 1
+ break
+
+ case '%B':
+ local = local.startsWith('en') ? 'english' : local
+
+ case '%b':
+ const m = _this.getMonth()
+ ans = local_labels.monthes[local][m]
+ break
+
+ case '%d':
+ case '%e':
+ ans = _this.getDate()
+ break
+
+ case '%j':
+ ans = _this.getDaysOfYear()
+ break
+
+ case '%U':
+ case '%W':
+ const ws = _this.getWeeksOfYear(f === '%W')
+ ans = padZero(ws, 2)
+ break
+
+ case '%w':
+ ans = _this.getDay()
+
+ case '%u':
+ ans = ans === 0 ? 7 : ans
+ break
+
+ case '%A':
+ local = local.startsWith('en') ? 'english' : local
+
+ case '%a':
+ const d = _this.getDay()
+ ans = local_labels.weekdays[local][d]
+ break
+
+ case '%H':
+ case '%k':
+ ans = _this.getHours()
+ break
+
+ case '%I':
+ case '%l':
+ ans = _this.getHours()
+ ans = ans % 12
+ break
+
+ case '%M':
+ ans = _this.getMinutes()
+ break
+
+ case '%S':
+ ans = _this.getSeconds()
+ break
+
+ case '%s':
+ ans = parseInt(_this.getTime() / 1E3)
+ break
+
+ case '%f':
+ const ms = _this.getMilliseconds()
+ ans = padZero(ms * 1E3, 6)
+ break
+
+ case '%P':
+ local = local.startsWith('en') ? 'english' : local
+
+ case '%p':
+ const h = _this.getHours()
+ ans = local_labels.meridians[local][h < 12 ? 0 : 1]
+ break
+
+ case '%z':
+ let tzo = _this.getTimezoneOffset()
+ const sign = tzo < 0 ? '-' : '+'
+ tzo = Math.abs(tzo)
+ const ho = padZero(tzo / 60, 2)
+ const mo = padZero(tzo % 60, 2)
+ ans = sign + ho + mo
+ break
+
+ default:
+ break
+ }
+ if (f === '%C' || f === '%y' || f === '%m' || f === '%d' || f === '%H' || f === '%M' || f === '%S') {
+ ans = padZero(ans, 2)
+ }
+ return ans.toString()
+ })
+}
+
+Date.prototype.humanize = function(local) {
+ local = local && local.startsWith('zh') ? 'zh' : 'en'
+ const result = this.strftime('', local)
+ const days = (Date.today() - this.toMidnight().getTime()) / 8.64E7
+ if (days <= -10 || days >= 10) {
+ return result
+ }
+ const labels = local_labels.dayagos[local]
+ let lbl = ''
+ if (days === 0 || days === 1) {
+ lbl = labels[days]
+ } else if (days === -1) {
+ lbl = labels[2]
+ } else if (days >= 2) {
+ lbl = days + labels[3]
+ } else {
+ lbl = days + labels[4]
+ }
+ return lbl + result.substr(10, 6)
+}
+
+const local_labels = {
+ monthes: {
+ english: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
+ en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ zh: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
+ },
+ weekdays: {
+ english: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ zh: ['日', '一', '二', '三', '四', '五', '六']
+ },
+ meridians: {
+ english: ['a.m.', 'p.m.'],
+ en: ['AM', 'PM'],
+ zh: ['上午', '下午']
+ },
+ dayagos: {
+ english: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'],
+ en: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'],
+ zh: ['今天', '昨天', '明天', '天前', '天后']
+ }
+}
+
+export default Date
diff --git a/acs/nladmin-ui/src/utils/index.js b/acs/nladmin-ui/src/utils/index.js
new file mode 100644
index 0000000..ab7ad30
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/index.js
@@ -0,0 +1,388 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * Parse the time to string
+ * @param {(Object|string|number)} time
+ * @param {string} cFormat
+ * @returns {string}
+ */
+export function parseTime(time, cFormat) {
+ if (arguments.length === 0) {
+ return null
+ }
+ const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'undefined' || time === null || time === 'null') {
+ return ''
+ } else if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+ time = parseInt(time)
+ }
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+ let value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
+ if (result.length > 0 && value < 10) {
+ value = '0' + value
+ }
+ return value || 0
+ })
+ return time_str
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+ if (('' + time).length === 10) {
+ time = parseInt(time) * 1000
+ } else {
+ time = +time
+ }
+ const d = new Date(time)
+ const now = Date.now()
+
+ const diff = (now - d) / 1000
+
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ return parseTime(time, option)
+ } else {
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
+ }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+ url = url == null ? window.location.href : url
+ const search = url.substring(url.lastIndexOf('?') + 1)
+ const obj = {}
+ const reg = /([^?&=]+)=([^?&=]*)/g
+ search.replace(reg, (rs, $1, $2) => {
+ const name = decodeURIComponent($1)
+ let val = decodeURIComponent($2)
+ val = String(val)
+ obj[name] = val
+ return rs
+ })
+ return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+ // returns the byte length of an utf8 string
+ let s = str.length
+ for (var i = str.length - 1; i >= 0; i--) {
+ const code = str.charCodeAt(i)
+ if (code > 0x7f && code <= 0x7ff) s++
+ else if (code > 0x7ff && code <= 0xffff) s += 2
+ if (code >= 0xDC00 && code <= 0xDFFF) i--
+ }
+ return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+ const newArray = []
+ for (let i = 0; i < actual.length; i++) {
+ if (actual[i]) {
+ newArray.push(actual[i])
+ }
+ }
+ return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+ if (!json) return ''
+ return cleanArray(
+ Object.keys(json).map(key => {
+ if (json[key] === undefined) return ''
+ return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ })
+ ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+ const search = url.split('?')[1]
+ if (!search) {
+ return {}
+ }
+ return JSON.parse(
+ '{"' +
+ decodeURIComponent(search)
+ .replace(/"/g, '\\"')
+ .replace(/&/g, '","')
+ .replace(/=/g, '":"')
+ .replace(/\+/g, ' ') +
+ '"}'
+ )
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+ const div = document.createElement('div')
+ div.innerHTML = val
+ return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+ if (typeof target !== 'object') {
+ target = {}
+ }
+ if (Array.isArray(source)) {
+ return source.slice()
+ }
+ Object.keys(source).forEach(property => {
+ const sourceProperty = source[property]
+ if (typeof sourceProperty === 'object') {
+ target[property] = objectMerge(target[property], sourceProperty)
+ } else {
+ target[property] = sourceProperty
+ }
+ })
+ return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+ if (!element || !className) {
+ return
+ }
+ let classString = element.className
+ const nameIndex = classString.indexOf(className)
+ if (nameIndex === -1) {
+ classString += '' + className
+ } else {
+ classString =
+ classString.substr(0, nameIndex) +
+ classString.substr(nameIndex + className.length)
+ }
+ element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+ if (type === 'start') {
+ return new Date().getTime() - 3600 * 1000 * 24 * 90
+ } else {
+ return new Date(new Date().toDateString())
+ }
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+ let timeout, args, context, timestamp, result
+
+ const later = function() {
+ // 据上一次触发时间间隔
+ const last = +new Date() - timestamp
+
+ // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
+ if (last < wait && last > 0) {
+ timeout = setTimeout(later, wait - last)
+ } else {
+ timeout = null
+ // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+ if (!immediate) {
+ result = func.apply(context, args)
+ if (!timeout) context = args = null
+ }
+ }
+ }
+
+ return function(...args) {
+ context = this
+ timestamp = +new Date()
+ const callNow = immediate && !timeout
+ // 如果延时不存在,重新设定延时
+ if (!timeout) timeout = setTimeout(later, wait)
+ if (callNow) {
+ result = func.apply(context, args)
+ context = args = null
+ }
+
+ return result
+ }
+}
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone(source) {
+ if (!source && typeof source !== 'object') {
+ throw new Error('error arguments', 'deepClone')
+ }
+ const targetObj = source.constructor === Array ? [] : {}
+ Object.keys(source).forEach(keys => {
+ if (source[keys] && typeof source[keys] === 'object') {
+ targetObj[keys] = deepClone(source[keys])
+ } else {
+ targetObj[keys] = source[keys]
+ }
+ })
+ return targetObj
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+ return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+ const timestamp = +new Date() + ''
+ const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+ return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+ return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+ if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+ if (hasClass(ele, cls)) {
+ const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+ ele.className = ele.className.replace(reg, ' ')
+ }
+}
+
+// 替换邮箱字符
+export function regEmail(email) {
+ if (String(email).indexOf('@') > 0) {
+ const str = email.split('@')
+ let _s = ''
+ if (str[0].length > 3) {
+ for (var i = 0; i < str[0].length - 3; i++) {
+ _s += '*'
+ }
+ }
+ var new_email = str[0].substr(0, 3) + _s + '@' + str[1]
+ }
+ return new_email
+}
+
+// 替换手机字符
+export function regMobile(mobile) {
+ if (mobile.length > 7) {
+ var new_mobile = mobile.substr(0, 3) + '****' + mobile.substr(7)
+ }
+ return new_mobile
+}
+
+// 下载文件
+export function downloadFile(obj, name, suffix) {
+ const url = window.URL.createObjectURL(new Blob([obj]))
+ const link = document.createElement('a')
+ link.style.display = 'none'
+ link.href = url
+ const fileName = parseTime(new Date()) + '-' + name + '.' + suffix
+ link.setAttribute('download', fileName)
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+}
diff --git a/acs/nladmin-ui/src/utils/nladmin.js b/acs/nladmin-ui/src/utils/nladmin.js
new file mode 100644
index 0000000..0c105ce
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/nladmin.js
@@ -0,0 +1,267 @@
+
+/**
+ * 通用js方法封装处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+// 日期格式化
+export function parseTime(time, pattern) {
+ if (arguments.length === 0 || !time) {
+ return null
+ }
+ const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+ time = parseInt(time)
+ } else if (typeof time === 'string') {
+ time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '')
+ }
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+ let value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
+ if (result.length > 0 && value < 10) {
+ value = '0' + value
+ }
+ return value || 0
+ })
+ return time_str
+}
+
+// 表单重置
+export function resetForm(refName) {
+ if (this.$refs[refName]) {
+ this.$refs[refName].resetFields()
+ }
+}
+
+// 添加日期范围
+export function addDateRange(params, dateRange, propName) {
+ const search = params
+ search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}
+ dateRange = Array.isArray(dateRange) ? dateRange : []
+ if (typeof (propName) === 'undefined') {
+ search.params['beginTime'] = dateRange[0]
+ search.params['endTime'] = dateRange[1]
+ } else {
+ search.params['begin' + propName] = dateRange[0]
+ search.params['end' + propName] = dateRange[1]
+ }
+ return search
+}
+
+// 回显数据字典
+export function selectDictLabel(datas, value) {
+ var actions = []
+ Object.keys(datas).some((key) => {
+ if (datas[key].value == ('' + value)) {
+ actions.push(datas[key].label)
+ return true
+ }
+ })
+ return actions.join('')
+}
+
+// 回显数据字典(字符串数组)
+export function selectDictLabels(datas, value, separator) {
+ if (value === undefined) {
+ return ''
+ }
+ var actions = []
+ var currentSeparator = undefined === separator ? ',' : separator
+ var temp = value.split(currentSeparator)
+ Object.keys(value.split(currentSeparator)).some((val) => {
+ Object.keys(datas).some((key) => {
+ if (datas[key].value == ('' + temp[val])) {
+ actions.push(datas[key].label + currentSeparator)
+ }
+ })
+ })
+ return actions.join('').substring(0, actions.join('').length - 1)
+}
+
+// 字符串格式化(%s )
+export function sprintf(str) {
+ var args = arguments; var flag = true; var i = 1
+ str = str.replace(/%s/g, function() {
+ var arg = args[i++]
+ if (typeof arg === 'undefined') {
+ flag = false
+ return ''
+ }
+ return arg
+ })
+ return flag ? str : ''
+}
+
+// 转换字符串,undefined,null等转化为""
+export function parseStrEmpty(str) {
+ if (!str || str == 'undefined' || str == 'null') {
+ return ''
+ }
+ return str
+}
+
+// 数据合并
+export function mergeRecursive(source, target) {
+ for (var p in target) {
+ try {
+ if (target[p].constructor == Object) {
+ source[p] = mergeRecursive(source[p], target[p])
+ } else {
+ source[p] = target[p]
+ }
+ } catch (e) {
+ source[p] = target[p]
+ }
+ }
+ return source
+}
+
+/**
+ * 构造树型结构数据
+ * @param {*} data 数据源
+ * @param {*} id id字段 默认 'id'
+ * @param {*} parentId 父节点字段 默认 'parentId'
+ * @param {*} children 孩子节点字段 默认 'children'
+ */
+export function handleTree(data, id, parentId, children) {
+ const config = {
+ id: id || 'id',
+ parentId: parentId || 'parentId',
+ childrenList: children || 'children'
+ }
+
+ var childrenListMap = {}
+ var nodeIds = {}
+ var tree = []
+
+ for (const d of data) {
+ const parentId = d[config.parentId]
+ if (childrenListMap[parentId] == null) {
+ childrenListMap[parentId] = []
+ }
+ nodeIds[d[config.id]] = d
+ childrenListMap[parentId].push(d)
+ }
+
+ for (const d of data) {
+ const parentId = d[config.parentId]
+ if (nodeIds[parentId] == null) {
+ tree.push(d)
+ }
+ }
+
+ for (const t of tree) {
+ adaptToChildrenList(t)
+ }
+
+ function adaptToChildrenList(o) {
+ if (childrenListMap[o[config.id]] !== null) {
+ o[config.childrenList] = childrenListMap[o[config.id]]
+ }
+ if (o[config.childrenList]) {
+ for (const c of o[config.childrenList]) {
+ adaptToChildrenList(c)
+ }
+ }
+ }
+ return tree
+}
+
+/**
+ * 参数处理
+ * @param {*} params 参数
+ */
+export function tansParams(params) {
+ let result = ''
+ for (const propName of Object.keys(params)) {
+ const value = params[propName]
+ var part = encodeURIComponent(propName) + '='
+ if (value !== null && typeof (value) !== 'undefined') {
+ if (typeof value === 'object') {
+ for (const key of Object.keys(value)) {
+ if (value[key] !== null && typeof (value[key]) !== 'undefined') {
+ const params = propName + '[' + key + ']'
+ var subPart = encodeURIComponent(params) + '='
+ result += subPart + encodeURIComponent(value[key]) + '&'
+ }
+ }
+ } else {
+ result += part + encodeURIComponent(value) + '&'
+ }
+ }
+ }
+ return result
+}
+
+// 验证是否为blob格式
+export async function blobValidate(data) {
+ try {
+ const text = await data.text()
+ JSON.parse(text)
+ return false
+ } catch (error) {
+ return true
+ }
+}
+
+/**
+ * 自动列宽
+ * flexWidth: https://blog.csdn.net/luoyumeiluoyumei/article/details/125853152?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-125853152-blog-123421632.pc_relevant_recovery_v2&spm=1001.2101.3001.4242.2&utm_relevant_index=4
+ * @param prop 每列的prop 不能为空
+ * @param tableData 表格数据
+ * @param title 标题长内容短的,传标题 不能为空
+ * @param num 列中有标签等加的富余量
+ * @returns 列的宽度
+ * 注:prop,title有一个必传
+ */
+export function flexWidth(prop, tableData, title, num = 0) {
+ if (tableData.length === 0) { // 表格没数据不做处理
+ return
+ }
+ let flexWidth = 0// 初始化表格列宽
+ let columnContent = ''// 占位最宽的内容
+ const canvas = document.createElement('canvas')
+ const context = canvas.getContext('2d')
+ context.font = '14px Microsoft YaHei'
+ // 获取占位最宽的内容
+ let index = 0
+ for (let i = 0; i < tableData.length; i++) { // 循环表格内容,获取表格内容中最长的数据
+ const now_temp = tableData[i][prop] + ''
+ const max_temp = tableData[index][prop] + ''
+ const now_temp_w = context.measureText(now_temp).width
+ const max_temp_w = context.measureText(max_temp).width
+ if (now_temp_w > max_temp_w) {
+ index = i
+ }
+ }
+ columnContent = tableData[index][prop]
+ const column_w = context.measureText(columnContent).width
+ const title_w = context.measureText(title).width
+ if (column_w < title_w) {
+ columnContent = title || '留四个字'
+ }
+ // 计算最宽内容的列宽
+ const width = context.measureText(columnContent)
+ flexWidth = width.width + 20 + num
+ return flexWidth + 'px'
+}
+
diff --git a/acs/nladmin-ui/src/utils/permission.js b/acs/nladmin-ui/src/utils/permission.js
new file mode 100644
index 0000000..6ada6bb
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/permission.js
@@ -0,0 +1,25 @@
+import store from '@/store'
+
+/**
+ * @param {Array} value
+ * @returns {Boolean}
+ * @example see @/views/permission/directive.vue
+ */
+export default function checkPermission(value) { // 权限判断
+ if (value && value instanceof Array && value.length > 0) {
+ const roles = store.getters && store.getters.roles
+ const permissionRoles = value
+ // debugger
+ const hasPermission = roles.some(role => {
+ return permissionRoles.includes(role)
+ })
+
+ if (!hasPermission) {
+ return false
+ }
+ return true
+ } else {
+ console.error(`need roles! Like v-permission="['admin','editor']"`)
+ return false
+ }
+}
diff --git a/acs/nladmin-ui/src/utils/request.js b/acs/nladmin-ui/src/utils/request.js
new file mode 100644
index 0000000..c5d886d
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/request.js
@@ -0,0 +1,91 @@
+import axios from 'axios'
+import router from '@/router/routers'
+import { Notification } from 'element-ui'
+import store from '../store'
+import { getToken } from '@/utils/auth'
+import Config from '@/settings'
+import Cookies from 'js-cookie'
+
+const baseURLStr = window.g.prod.VUE_APP_BASE_API
+
+// 创建axios实例
+const service = axios.create({
+ baseURL: process.env.NODE_ENV === 'production' ? baseURLStr : '/', // api 的 base_url
+ timeout: Config.timeout // 请求超时时间
+})
+
+// request拦截器
+service.interceptors.request.use(
+ config => {
+ if (getToken()) {
+ config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
+ }
+ config.headers['Content-Type'] = 'application/json'
+ return config
+ },
+ error => {
+ Promise.reject(error)
+ }
+)
+
+// response 拦截器
+service.interceptors.response.use(
+ response => {
+ return response.data
+ },
+ error => {
+ // 兼容blob下载出错json提示
+ if (error.response.data instanceof Blob && error.response.data.type.toLowerCase().indexOf('json') !== -1) {
+ const reader = new FileReader()
+ reader.readAsText(error.response.data, 'utf-8')
+ reader.onload = function(e) {
+ const errorMsg = JSON.parse(reader.result).message
+ Notification.error({
+ title: errorMsg,
+ duration: 5000
+ })
+ }
+ } else {
+ let code = 0
+ try {
+ code = error.response.data.status
+ } catch (e) {
+ if (error.toString().indexOf('Error: timeout') !== -1) {
+ Notification.error({
+ title: '网络请求超时',
+ duration: 5000
+ })
+ return Promise.reject(error)
+ }
+ }
+ console.log(code)
+ if (code) {
+ if (code === 401) {
+ // debugger
+ store.dispatch('LogOut').then(() => {
+ // 用户登录界面提示
+ Cookies.set('point', 401)
+ location.reload()
+ })
+ } else if (code === 403) {
+ router.push({ path: '/401' })
+ } else {
+ const errorMsg = error.response.data.message
+ if (errorMsg !== undefined) {
+ Notification.error({
+ title: errorMsg,
+ duration: 5000
+ })
+ }
+ }
+ } else {
+ Notification.error({
+ title: '接口请求失败',
+ duration: 5000
+ })
+ }
+ }
+ return Promise.reject(error)
+ }
+)
+export default service
diff --git a/acs/nladmin-ui/src/utils/rsaEncrypt.js b/acs/nladmin-ui/src/utils/rsaEncrypt.js
new file mode 100644
index 0000000..83db480
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/rsaEncrypt.js
@@ -0,0 +1,30 @@
+import JSEncrypt from 'jsencrypt/bin/jsencrypt'
+
+// 密钥对生成 http://web.chacuo.net/netrsakeypair
+
+const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' +
+ '2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ=='
+
+const privateKey = 'MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n' +
+ 'mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n' +
+ 'B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n' +
+ '/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n' +
+ 'UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n' +
+ 'vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n' +
+ '4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n' +
+ 'tTbklZkD2A=='
+
+// 加密
+export function encrypt(txt) {
+ const encryptor = new JSEncrypt()
+ encryptor.setPublicKey(publicKey) // 设置公钥
+ return encryptor.encrypt(txt) // 对需要加密的数据进行加密
+}
+
+// 解密
+export function decrypt(txt) {
+ const encryptor = new JSEncrypt()
+ encryptor.setPrivateKey(privateKey)
+ return encryptor.decrypt(txt)
+}
+
diff --git a/acs/nladmin-ui/src/utils/shortcuts.js b/acs/nladmin-ui/src/utils/shortcuts.js
new file mode 100644
index 0000000..a191590
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/shortcuts.js
@@ -0,0 +1,96 @@
+import Date from './datetime.js'
+
+export const calendarBaseShortcuts = [{
+ text: '今天',
+ onClick(picker) {
+ const start = new Date()
+ picker.$emit('pick', [start, start])
+ }
+}, {
+ text: '昨天',
+ onClick(picker) {
+ const start = new Date().daysAgo(1)
+ picker.$emit('pick', [start, start])
+ }
+}, {
+ text: '最近一周',
+ onClick(picker) {
+ const start = new Date().daysAgo(7)
+ picker.$emit('pick', [start, new Date()])
+ }
+}, {
+ text: '最近30天',
+ onClick(picker) {
+ const start = new Date().daysAgo(30)
+ picker.$emit('pick', [start, new Date()])
+ }
+}, {
+ text: '这个月',
+ onClick(picker) {
+ const start = new Date().monthBegin()
+ picker.$emit('pick', [start, new Date()])
+ }
+}, {
+ text: '本季度',
+ onClick(picker) {
+ const start = new Date().quarterBegin()
+ picker.$emit('pick', [start, new Date()])
+ }
+}]
+
+export const calendarMoveShortcuts = [{
+ text: '‹ 往前一天 ',
+ onClick(picker) {
+ if (picker.value.length === 0) {
+ picker.value = [new Date(), new Date()]
+ }
+ const start = picker.value[0].daysAgo(1)
+ const end = picker.value[1].daysAgo(1)
+ picker.$emit('pick', [start, end])
+ }
+}, {
+ text: ' 往后一天 ›',
+ onClick(picker) {
+ let start = new Date()
+ let end = new Date()
+ if (picker.value.length > 0) {
+ if (end - picker.value[1] > 8.64E7) {
+ start = picker.value[0].daysAgo(-1)
+ end = picker.value[1].daysAgo(-1)
+ } else {
+ start = picker.value[0]
+ }
+ }
+ picker.$emit('pick', [start, end])
+ }
+}, {
+ text: '« 往前一周 ',
+ onClick(picker) {
+ if (picker.value.length === 0) {
+ picker.value = [new Date().daysAgo(7), new Date()]
+ }
+ const start = picker.value[0].daysAgo(7)
+ const end = picker.value[1].daysAgo(7)
+ picker.$emit('pick', [start, end])
+ }
+}, {
+ text: ' 往后一周 »',
+ onClick(picker) {
+ let start = new Date().daysAgo(7)
+ let end = new Date()
+ if (picker.value.length > 0) {
+ if (end - picker.value[1] > 8.64E7) {
+ start = picker.value[0].daysAgo(-7)
+ end = picker.value[1].daysAgo(-7)
+ } else {
+ start = picker.value[0]
+ }
+ }
+ picker.$emit('pick', [start, end])
+ }
+}]
+
+export const calendarShortcuts = [
+ ...calendarBaseShortcuts,
+ ...calendarMoveShortcuts
+]
diff --git a/acs/nladmin-ui/src/utils/upload.js b/acs/nladmin-ui/src/utils/upload.js
new file mode 100644
index 0000000..945414b
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/upload.js
@@ -0,0 +1,11 @@
+import axios from 'axios'
+import { getToken } from '@/utils/auth'
+
+export function upload(api, file) {
+ var data = new FormData()
+ data.append('file', file)
+ const config = {
+ headers: { 'Authorization': getToken() }
+ }
+ return axios.post(api, data, config)
+}
diff --git a/acs/nladmin-ui/src/utils/validate.js b/acs/nladmin-ui/src/utils/validate.js
new file mode 100644
index 0000000..d215791
--- /dev/null
+++ b/acs/nladmin-ui/src/utils/validate.js
@@ -0,0 +1,168 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+ return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+ const valid_map = ['admin', 'editor']
+ return valid_map.indexOf(str.trim()) >= 0
+}
+
+/**
+ * @param {string} url
+ * @returns {Boolean}
+ */
+export function validURL(url) {
+ const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+ return reg.test(url)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validLowerCase(str) {
+ const reg = /^[a-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUpperCase(str) {
+ const reg = /^[A-Z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validAlphabets(str) {
+ const reg = /^[A-Za-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} email
+ * @returns {Boolean}
+ */
+export function validEmail(email) {
+ const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+ return reg.test(email)
+}
+
+export function isvalidPhone(phone) {
+ const reg = /^1[3|4|5|7|8][0-9]\d{8}$/
+ return reg.test(phone)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function isString(str) {
+ if (typeof str === 'string' || str instanceof String) {
+ return true
+ }
+ return false
+}
+
+/**
+ * @param {Array} arg
+ * @returns {Boolean}
+ */
+export function isArray(arg) {
+ if (typeof Array.isArray === 'undefined') {
+ return Object.prototype.toString.call(arg) === '[object Array]'
+ }
+ return Array.isArray(arg)
+}
+
+/**
+ * 是否合法IP地址
+ * @param rule
+ * @param value
+ * @param callback
+ */
+export function validateIP(rule, value, callback) {
+ if (value === '' || value === undefined || value == null) {
+ callback()
+ } else {
+ const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
+ if ((!reg.test(value)) && value !== '') {
+ callback(new Error('请输入正确的IP地址'))
+ } else {
+ callback()
+ }
+ }
+}
+
+/* 是否手机号码或者固话*/
+export function validatePhoneTwo(rule, value, callback) {
+ const reg = /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/
+ if (value === '' || value === undefined || value == null) {
+ callback()
+ } else {
+ if ((!reg.test(value)) && value !== '') {
+ callback(new Error('请输入正确的电话号码或者固话号码'))
+ } else {
+ callback()
+ }
+ }
+}
+
+/* 是否固话*/
+export function validateTelephone(rule, value, callback) {
+ const reg = /0\d{2}-\d{7,8}/
+ if (value === '' || value === undefined || value == null) {
+ callback()
+ } else {
+ if ((!reg.test(value)) && value !== '') {
+ callback(new Error('请输入正确的固话(格式:区号+号码,如010-1234567)'))
+ } else {
+ callback()
+ }
+ }
+}
+
+/* 是否手机号码*/
+export function validatePhone(rule, value, callback) {
+ const reg = /^[1][3,4,5,7,8][0-9]{9}$/
+ if (value === '' || value === undefined || value == null) {
+ callback()
+ } else {
+ if ((!reg.test(value)) && value !== '') {
+ callback(new Error('请输入正确的电话号码'))
+ } else {
+ callback()
+ }
+ }
+}
+
+/* 是否身份证号码*/
+export function validateIdNo(rule, value, callback) {
+ const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
+ if (value === '' || value === undefined || value == null) {
+ callback()
+ } else {
+ if ((!reg.test(value)) && value !== '') {
+ callback(new Error('请输入正确的身份证号码'))
+ } else {
+ callback()
+ }
+ }
+}
+
diff --git a/acs/nladmin-ui/src/views/acs/config/assigned/index.vue b/acs/nladmin-ui/src/views/acs/config/assigned/index.vue
new file mode 100644
index 0000000..04104a0
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/config/assigned/index.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/config/trafficControl/index.vue b/acs/nladmin-ui/src/views/acs/config/trafficControl/index.vue
new file mode 100644
index 0000000..04104a0
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/config/trafficControl/index.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/UploadDialog.vue b/acs/nladmin-ui/src/views/acs/device/UploadDialog.vue
new file mode 100644
index 0000000..b299a0e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/UploadDialog.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+ 将文件拖到此处,或
+ 点击上传
+
+ 只能上传Excel文件,且不超过10MB
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/acsToERP/index.vue b/acs/nladmin-ui/src/views/acs/device/acsToERP/index.vue
new file mode 100644
index 0000000..c8b90a0
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/acsToERP/index.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/address/index.vue b/acs/nladmin-ui/src/views/acs/device/address/index.vue
new file mode 100644
index 0000000..d5eb9df
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/address/index.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/config.vue b/acs/nladmin-ui/src/views/acs/device/config.vue
new file mode 100644
index 0000000..477cdc6
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/config.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+ 基本信息:{{ device_code }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/deviceDbitem/index.vue b/acs/nladmin-ui/src/views/acs/device/deviceDbitem/index.vue
new file mode 100644
index 0000000..4784b2c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/deviceDbitem/index.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label.user_status[scope.row.item_code] }}
+
+
+
+
+ {{ dict.label.user_status[scope.row.item_name] }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/agv/agv_ndc_one.vue b/acs/nladmin-ui/src/views/acs/device/driver/agv/agv_ndc_one.vue
new file mode 100644
index 0000000..c1273a7
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/agv/agv_ndc_one.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/agv/agv_ndc_two.vue b/acs/nladmin-ui/src/views/acs/device/driver/agv/agv_ndc_two.vue
new file mode 100644
index 0000000..013bc25
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/agv/agv_ndc_two.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/box_palletizing_manipulator.vue b/acs/nladmin-ui/src/views/acs/device/driver/box_palletizing_manipulator.vue
new file mode 100644
index 0000000..07e38c9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/box_palletizing_manipulator.vue
@@ -0,0 +1,529 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/cargo_lift_conveyor.vue b/acs/nladmin-ui/src/views/acs/device/driver/cargo_lift_conveyor.vue
new file mode 100644
index 0000000..03caccd
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/cargo_lift_conveyor.vue
@@ -0,0 +1,533 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/empty_vehicle_stacking_position.vue b/acs/nladmin-ui/src/views/acs/device/driver/empty_vehicle_stacking_position.vue
new file mode 100644
index 0000000..097cd0b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/empty_vehicle_stacking_position.vue
@@ -0,0 +1,488 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/hailiang_smart_plc_test.vue b/acs/nladmin-ui/src/views/acs/device/driver/hailiang_smart_plc_test.vue
new file mode 100644
index 0000000..57bd63b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/hailiang_smart_plc_test.vue
@@ -0,0 +1,487 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/hongxiang_conveyor.vue b/acs/nladmin-ui/src/views/acs/device/driver/hongxiang_conveyor.vue
new file mode 100644
index 0000000..e0d20f8
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/hongxiang_conveyor.vue
@@ -0,0 +1,507 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/hongxiang_device.vue b/acs/nladmin-ui/src/views/acs/device/driver/hongxiang_device.vue
new file mode 100644
index 0000000..fa78611
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/hongxiang_device.vue
@@ -0,0 +1,506 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/lamp_three_color.vue b/acs/nladmin-ui/src/views/acs/device/driver/lamp_three_color.vue
new file mode 100644
index 0000000..bdb9079
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/lamp_three_color.vue
@@ -0,0 +1,344 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/oven_manipulator.vue b/acs/nladmin-ui/src/views/acs/device/driver/oven_manipulator.vue
new file mode 100644
index 0000000..d988d3c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/oven_manipulator.vue
@@ -0,0 +1,546 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/paint_conveyor.vue b/acs/nladmin-ui/src/views/acs/device/driver/paint_conveyor.vue
new file mode 100644
index 0000000..f4eea0b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/paint_conveyor.vue
@@ -0,0 +1,495 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/plug_pull_device_site.vue b/acs/nladmin-ui/src/views/acs/device/driver/plug_pull_device_site.vue
new file mode 100644
index 0000000..910db07
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/plug_pull_device_site.vue
@@ -0,0 +1,507 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor.vue b/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor.vue
new file mode 100644
index 0000000..7ecfb7d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor.vue
@@ -0,0 +1,539 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor_ckk.vue b/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor_ckk.vue
new file mode 100644
index 0000000..54f6fd8
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor_ckk.vue
@@ -0,0 +1,530 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor_labeling.vue b/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor_labeling.vue
new file mode 100644
index 0000000..98c28fe
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/siemens_conveyor_labeling.vue
@@ -0,0 +1,530 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/slit_two_manipulator.vue b/acs/nladmin-ui/src/views/acs/device/driver/slit_two_manipulator.vue
new file mode 100644
index 0000000..f593906
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/slit_two_manipulator.vue
@@ -0,0 +1,662 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_control.vue b/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_control.vue
new file mode 100644
index 0000000..99611ca
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_control.vue
@@ -0,0 +1,503 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_control_with_scanner.vue b/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_control_with_scanner.vue
new file mode 100644
index 0000000..8b02578
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_control_with_scanner.vue
@@ -0,0 +1,564 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_monitor.vue b/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_monitor.vue
new file mode 100644
index 0000000..62cd622
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/standard_conveyor_monitor.vue
@@ -0,0 +1,479 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/standard_inspect_site.vue b/acs/nladmin-ui/src/views/acs/device/driver/standard_inspect_site.vue
new file mode 100644
index 0000000..2a71c31
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/standard_inspect_site.vue
@@ -0,0 +1,489 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ OpcServer:
+
+
+
+
+
+ PLC:
+
+
+
+
+
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC读取字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试读
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入字段:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 测试写
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue b/acs/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue
new file mode 100644
index 0000000..0cd0926
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/standard_ordinary_site.vue
@@ -0,0 +1,231 @@
+
+
+
+
+
+ 输送系统:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AGV相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/standard_scanner.vue b/acs/nladmin-ui/src/views/acs/device/driver/standard_scanner.vue
new file mode 100644
index 0000000..21f4a7f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/standard_scanner.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/driver/standard_storage.vue b/acs/nladmin-ui/src/views/acs/device/driver/standard_storage.vue
new file mode 100644
index 0000000..3b3cd05
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/driver/standard_storage.vue
@@ -0,0 +1,315 @@
+
+
+
+
+
+ 指令相关:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 设备协议:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/index.vue b/acs/nladmin-ui/src/views/acs/device/index.vue
new file mode 100644
index 0000000..fa87c1e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/index.vue
@@ -0,0 +1,267 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 导入
+
+
+ 同步
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.device_name }}
+
+
+
+
+ {{ scope.row.device_type_name }}
+
+
+
+
+ {{ scope.row.region_name }}
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+ 驱动配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/monitor/index.vue b/acs/nladmin-ui/src/views/acs/device/monitor/index.vue
new file mode 100644
index 0000000..35bfca3
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/monitor/index.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/opc/index.vue b/acs/nladmin-ui/src/views/acs/device/opc/index.vue
new file mode 100644
index 0000000..1afca03
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/opc/index.vue
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改
+ 删除
+
+ 新增PLC
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/protocol/index.vue b/acs/nladmin-ui/src/views/acs/device/protocol/index.vue
new file mode 100644
index 0000000..ea861d1
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/protocol/index.vue
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 导出CSV
+
+
+ 导出SMARTCSV
+
+
+ 导出FX5UCSV
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.driver_code }}
+
+
+
+
+ {{ scope.row.extra_code }}
+
+
+
+
+
+ {{ scope.row.extra_name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/device/storageCell/index.vue b/acs/nladmin-ui/src/views/acs/device/storageCell/index.vue
new file mode 100644
index 0000000..bf0d0ad
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/device/storageCell/index.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue
new file mode 100644
index 0000000..e5cf3a9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue
@@ -0,0 +1,276 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 就绪
+ 执行中
+ 完成
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue b/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue
new file mode 100644
index 0000000..5f3a42f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/history/taskRecord/index.vue
@@ -0,0 +1,555 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 就绪
+ 执行中
+ 完成
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/history/taskTreeRecord/index.vue b/acs/nladmin-ui/src/views/acs/history/taskTreeRecord/index.vue
new file mode 100644
index 0000000..ac8fd51
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/history/taskTreeRecord/index.vue
@@ -0,0 +1,212 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 就绪
+ 执行中
+ 完成
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/instruction/index.vue b/acs/nladmin-ui/src/views/acs/instruction/index.vue
new file mode 100644
index 0000000..215bc6c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/instruction/index.vue
@@ -0,0 +1,377 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 同步
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label.task_type[scope.row.instruction_type] }}
+
+
+
+
+
+
+
+ 就绪
+ 执行中
+ 完成
+
+
+
+
+ 未下发
+ 成功
+ 失败
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 完成
+ 取消
+ 强制取消
+ 初始化
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/monitor/device/XJDeviceMonitor.vue b/acs/nladmin-ui/src/views/acs/monitor/device/XJDeviceMonitor.vue
new file mode 100644
index 0000000..f6a8a16
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/monitor/device/XJDeviceMonitor.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/monitor/device/index.vue b/acs/nladmin-ui/src/views/acs/monitor/device/index.vue
new file mode 100644
index 0000000..d800fc2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/monitor/device/index.vue
@@ -0,0 +1,619 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无货
+ 有托盘
+ 有托盘有货
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无货
+ 空料斗
+ 满料斗
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/monitor/device/index2.vue b/acs/nladmin-ui/src/views/acs/monitor/device/index2.vue
new file mode 100644
index 0000000..febabca
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/monitor/device/index2.vue
@@ -0,0 +1,631 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无货
+ 有托盘
+ 有托盘有货
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无货
+ 空料斗
+ 满料斗
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/protocolConfig/config.vue b/acs/nladmin-ui/src/views/acs/protocolConfig/config.vue
new file mode 100644
index 0000000..23c2721
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/protocolConfig/config.vue
@@ -0,0 +1,237 @@
+
+
+
+
+
+ 设备协议:
+
+
+
+
+ PLC读取协议:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PLC写入协议:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 导出协议
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/protocolConfig/index.vue b/acs/nladmin-ui/src/views/acs/protocolConfig/index.vue
new file mode 100644
index 0000000..54e69b5
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/protocolConfig/index.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+ 基本信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/route/routeChart/index.vue b/acs/nladmin-ui/src/views/acs/route/routeChart/index.vue
new file mode 100644
index 0000000..ad0f1a5
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/route/routeChart/index.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
{{ path }}
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/route/routeLine/index.vue b/acs/nladmin-ui/src/views/acs/route/routeLine/index.vue
new file mode 100644
index 0000000..9ac8216
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/route/routeLine/index.vue
@@ -0,0 +1,358 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 同步
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 输送路由
+ agv路由
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/route/routeLoc/index.vue b/acs/nladmin-ui/src/views/acs/route/routeLoc/index.vue
new file mode 100644
index 0000000..513a847
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/route/routeLoc/index.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/route/routePlan/index.vue b/acs/nladmin-ui/src/views/acs/route/routePlan/index.vue
new file mode 100644
index 0000000..2f75d7f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/route/routePlan/index.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/actor/index.vue b/acs/nladmin-ui/src/views/acs/stage/actor/index.vue
new file mode 100644
index 0000000..8189e44
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/actor/index.vue
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/Diagram.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/Diagram.vue
new file mode 100644
index 0000000..f08ed58
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/Diagram.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/DiagramSidebar.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/DiagramSidebar.vue
new file mode 100644
index 0000000..6fed18e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/DiagramSidebar.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/DiagramToolbar.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/DiagramToolbar.vue
new file mode 100644
index 0000000..8850245
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/DiagramToolbar.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/PropertyPanel.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/PropertyPanel.vue
new file mode 100644
index 0000000..92b811a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/PropertyPanel.vue
@@ -0,0 +1,311 @@
+
+
+
+
+
+
背景色
+
+ $_changeColorProperty(c, 'backgroundColor')" />
+
+
+
背景渐变色
+
+ $_changeColorProperty(c, 'gradientColor')" />
+
+
+
+
+
+
线条颜色
+
+ $_changeColorProperty(c, 'borderColor')" />
+
+
+
+
+ 线条宽度
+
+
+
+
+
+
文本颜色
+
+ $_changeColorProperty(c, 'fontColor')" />
+
+
+
+
+ 文本大小
+
+ px
+
+
+ 文本字体
+
+
+
+
+
+ 行高
+
+
+
+
+
+ 对齐
+
+ 左对齐
+ 居中
+ 右对齐
+
+
+
+ 文本样式
+ B
+ U
+ I
+
+
+ 置为顶部
+ 置为底部
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/config.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/config.js
new file mode 100644
index 0000000..c36ba60
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/config.js
@@ -0,0 +1,12 @@
+// 元素属性右侧面板默认属性
+export const defatuleStyle = {
+ backgroundColor: '', // 填充色
+ gradientColor: '', // 渐变色
+ borderType: 0, // 边框类型
+ borderColor: '', // 填充颜色
+ borderWidth: 1, // 边框宽度
+ borderStyle: '', // 边框类型
+ fontSize: 12, // 文本大小
+ fontColor: '', // 文本颜色
+ fontWeight: '' // 文本加粗
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Actor.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Actor.vue
new file mode 100644
index 0000000..dc3818d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Actor.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/AreaSelect.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/AreaSelect.vue
new file mode 100644
index 0000000..edb8929
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/AreaSelect.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Blod.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Blod.vue
new file mode 100644
index 0000000..3444a37
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Blod.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Circle.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Circle.vue
new file mode 100644
index 0000000..b8355a4
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Circle.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ColorFill.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ColorFill.vue
new file mode 100644
index 0000000..1c12d2a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ColorFill.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ColorText.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ColorText.vue
new file mode 100644
index 0000000..8aa7da1
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ColorText.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Cross.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Cross.vue
new file mode 100644
index 0000000..ba01527
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Cross.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Cylinde.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Cylinde.vue
new file mode 100644
index 0000000..c32f508
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Cylinde.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Diamond.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Diamond.vue
new file mode 100644
index 0000000..ae6e48a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Diamond.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Divide.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Divide.vue
new file mode 100644
index 0000000..32bbd4f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Divide.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/DownArrow.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/DownArrow.vue
new file mode 100644
index 0000000..01de6a0
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/DownArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Ellipse.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Ellipse.vue
new file mode 100644
index 0000000..e006fee
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Ellipse.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Font.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Font.vue
new file mode 100644
index 0000000..e9a1bb2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Font.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Heptagon.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Heptagon.vue
new file mode 100644
index 0000000..1f10cb2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Heptagon.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Hexagon.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Hexagon.vue
new file mode 100644
index 0000000..1a9c513
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Hexagon.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/HorizontalArrow.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/HorizontalArrow.vue
new file mode 100644
index 0000000..640f85c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/HorizontalArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/LeftArrow.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/LeftArrow.vue
new file mode 100644
index 0000000..c62689e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/LeftArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Line.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Line.vue
new file mode 100644
index 0000000..d4b7141
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Line.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Minus.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Minus.vue
new file mode 100644
index 0000000..e8a5c19
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Minus.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Parallelogram.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Parallelogram.vue
new file mode 100644
index 0000000..1929f72
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Parallelogram.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Pentagon.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Pentagon.vue
new file mode 100644
index 0000000..1f41d42
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Pentagon.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Rect.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Rect.vue
new file mode 100644
index 0000000..5a62bb4
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Rect.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/RectRadius.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/RectRadius.vue
new file mode 100644
index 0000000..ee233aa
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/RectRadius.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/RightArrow.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/RightArrow.vue
new file mode 100644
index 0000000..5099141
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/RightArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Septagon.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Septagon.vue
new file mode 100644
index 0000000..af70242
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Septagon.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/StepBack.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/StepBack.vue
new file mode 100644
index 0000000..254da46
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/StepBack.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/StepFoward.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/StepFoward.vue
new file mode 100644
index 0000000..cd96b6b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/StepFoward.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Table.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Table.vue
new file mode 100644
index 0000000..50bdced
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Table.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Text.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Text.vue
new file mode 100644
index 0000000..c1af1cd
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Text.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Times.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Times.vue
new file mode 100644
index 0000000..cbe890c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Times.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Trapezoid.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Trapezoid.vue
new file mode 100644
index 0000000..5d23b92
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Trapezoid.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Triangle.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Triangle.vue
new file mode 100644
index 0000000..e40db56
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/Triangle.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/UpArrow.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/UpArrow.vue
new file mode 100644
index 0000000..2ce28d7
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/UpArrow.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/VerticalArrow.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/VerticalArrow.vue
new file mode 100644
index 0000000..360d21b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/VerticalArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ZoomIn.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ZoomIn.vue
new file mode 100644
index 0000000..a525716
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ZoomIn.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ZoomOut.vue b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ZoomOut.vue
new file mode 100644
index 0000000..c30a25f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/icon/ZoomOut.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/DownArrowNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/DownArrowNode.js
new file mode 100644
index 0000000..e32d3c9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/DownArrowNode.js
@@ -0,0 +1,49 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 下箭头
+
+class DownArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 50
+ this.height = 80
+ }
+}
+class DownArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowWidth = 1 / 3 * width
+ const upY = y - 1 / 2 * height
+ const downY = y + 1 / 2 * height
+ const downY2 = y + 1 / 5 * height
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [x - 1 / 2 * ArrowWidth, downY2],
+ [x - 1 / 2 * width, downY2],
+ [x, downY],
+ [x + 1 / 2 * width, downY2],
+ [x + 1 / 2 * ArrowWidth, downY2],
+ [x + 1 / 2 * ArrowWidth, upY],
+ [x - 1 / 2 * ArrowWidth, upY]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'down-arrow',
+ view: DownArrowView,
+ model: DownArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/HorizontalArrowNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/HorizontalArrowNode.js
new file mode 100644
index 0000000..0a8bf80
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/HorizontalArrowNode.js
@@ -0,0 +1,56 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 水平双箭头
+
+class HorizontalArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 40
+ }
+}
+
+class HorizontalArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowHeight = 1 / 3 * height
+ const leftX = x - 1 / 2 * width
+ const leftX2 = x - 1 / 5 * width
+ const rightX = x + 1 / 2 * width
+ const rightX2 = x + 1 / 5 * width
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ // 右箭头
+ [rightX2, y - 1 / 2 * ArrowHeight],
+ [rightX2, y - 1 / 2 * height],
+ [rightX, y],
+ [rightX2, y + 1 / 2 * height],
+ [rightX2, y + 1 / 2 * ArrowHeight],
+ // 左箭头
+ [leftX2, y + 1 / 2 * ArrowHeight],
+ [leftX2, y + 1 / 2 * height],
+ [leftX, y],
+ [leftX2, y - 1 / 2 * height],
+ [leftX2, y - 1 / 2 * ArrowHeight]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'horizontal-arrow',
+ view: HorizontalArrowView,
+ model: HorizontalArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/LeftArrow.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/LeftArrow.js
new file mode 100644
index 0000000..0405e10
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/LeftArrow.js
@@ -0,0 +1,48 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 左箭头
+class LeftArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 50
+ }
+}
+class LeftArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowHeight = 1 / 3 * height
+ const leftX = x - 1 / 2 * width
+ const leftX2 = x - 1 / 5 * width
+ const rightX = x + 1 / 2 * width
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [leftX2, y - 1 / 2 * ArrowHeight],
+ [leftX2, y - 1 / 2 * height],
+ [leftX, y],
+ [leftX2, y + 1 / 2 * height],
+ [leftX2, y + 1 / 2 * ArrowHeight],
+ [rightX, y + 1 / 2 * ArrowHeight],
+ [rightX, y - 1 / 2 * ArrowHeight]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'left-arrow',
+ view: LeftArrowView,
+ model: LeftArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/RightArrow.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/RightArrow.js
new file mode 100644
index 0000000..f963d0e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/RightArrow.js
@@ -0,0 +1,50 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 右箭头
+
+class RightArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 50
+ }
+}
+
+class RightArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowHeight = 1 / 3 * height
+ const leftX = x - 1 / 2 * width
+ const rightX = x + 1 / 2 * width
+ const rightX2 = x + 1 / 5 * width
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [rightX2, y - 1 / 2 * ArrowHeight],
+ [rightX2, y - 1 / 2 * height],
+ [rightX, y],
+ [rightX2, y + 1 / 2 * height],
+ [rightX2, y + 1 / 2 * ArrowHeight],
+ [leftX, y + 1 / 2 * ArrowHeight],
+ [leftX, y - 1 / 2 * ArrowHeight]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'right-arrow',
+ view: RightArrowView,
+ model: RightArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/UpArrowNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/UpArrowNode.js
new file mode 100644
index 0000000..ae9b538
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/UpArrowNode.js
@@ -0,0 +1,49 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 上箭头
+class UpArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 50
+ this.height = 80
+ }
+}
+
+class UpArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowWidth = 1 / 3 * width
+ const upY = y - 1 / 2 * height
+ const upY2 = y - 1 / 5 * height
+ const downY = y + 1 / 2 * height
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [x - 1 / 2 * ArrowWidth, upY2],
+ [x - 1 / 2 * width, upY2],
+ [x, upY],
+ [x + 1 / 2 * width, upY2],
+ [x + 1 / 2 * ArrowWidth, upY2],
+ [x + 1 / 2 * ArrowWidth, downY],
+ [x - 1 / 2 * ArrowWidth, downY]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'up-arrow',
+ view: UpArrowView,
+ model: UpArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/VerticalArrowNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/VerticalArrowNode.js
new file mode 100644
index 0000000..0a0fa26
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/arrow/VerticalArrowNode.js
@@ -0,0 +1,56 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 竖直箭头
+
+class VerticalArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 40
+ this.height = 80
+ }
+}
+
+class VerticalArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowWidth = 1 / 3 * width
+ const upY = y - 1 / 2 * height
+ const upY2 = y - 1 / 5 * height
+ const downY = y + 1 / 2 * height
+ const downY2 = y + 1 / 5 * height
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ // 上箭头
+ [x - 1 / 2 * ArrowWidth, upY2],
+ [x - 1 / 2 * width, upY2],
+ [x, upY],
+ [x + 1 / 2 * width, upY2],
+ [x + 1 / 2 * ArrowWidth, upY2],
+ // 下箭头
+ [x + 1 / 2 * ArrowWidth, downY2],
+ [x + 1 / 2 * width, downY2],
+ [x, downY],
+ [x - 1 / 2 * width, downY2],
+ [x - 1 / 2 * ArrowWidth, downY2]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'vertical-arrow',
+ view: VerticalArrowView,
+ model: VerticalArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/BaseNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/BaseNode.js
new file mode 100644
index 0000000..6c297ce
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/BaseNode.js
@@ -0,0 +1,16 @@
+import { BaseNode, BaseNodeModel } from '@logicflow/core'
+
+class BaseNewNode extends BaseNode {
+}
+
+class BaseNewModel extends BaseNodeModel {
+ setAttributes() {
+ this.fill = 'red'
+ }
+}
+
+export default {
+ type: 'BaseNode',
+ view: BaseNewNode,
+ model: BaseNewModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/CircleNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/CircleNode.js
new file mode 100644
index 0000000..cc37250
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/CircleNode.js
@@ -0,0 +1,33 @@
+import { EllipseResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 圆形
+class CircleNewModel extends EllipseResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.rx = 35
+ this.ry = 35
+ }
+
+ setToBottom() {
+ this.zIndex = 0
+ }
+
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+export default {
+ type: 'pro-circle',
+ view: EllipseResize.view,
+ model: CircleNewModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/DiamondNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/DiamondNode.js
new file mode 100644
index 0000000..38dc315
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/DiamondNode.js
@@ -0,0 +1,35 @@
+import { DiamondResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 菱形
+/**
+ * model控制初始化的值
+ */
+class DiamondModel extends DiamondResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.rx = 35
+ this.ry = 35
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+
+ setToBottom() {
+ this.zIndex = 0
+ }
+}
+
+export default {
+ type: 'pro-diamond',
+ view: DiamondResize.view,
+ model: DiamondModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/EllipseNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/EllipseNode.js
new file mode 100644
index 0000000..c297638
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/EllipseNode.js
@@ -0,0 +1,19 @@
+import CircleNode from './CircleNode'
+
+// 椭圆
+class EllipseNewModel extends CircleNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.rx = 60
+ this.ry = 30
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ return { ...style }
+ }
+}
+export default {
+ type: 'pro-ellipse',
+ view: CircleNode.view,
+ model: EllipseNewModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/RectNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/RectNode.js
new file mode 100644
index 0000000..ee242e2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/RectNode.js
@@ -0,0 +1,27 @@
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 矩形
+class RectNewModel extends RectResize.model {
+ setToBottom() {
+ this.zIndex = 0
+ }
+
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+export default {
+ type: 'pro-rect',
+ view: RectResize.view,
+ model: RectNewModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/RectRadiusNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/RectRadiusNode.js
new file mode 100644
index 0000000..9a336d6
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/RectRadiusNode.js
@@ -0,0 +1,14 @@
+import RectNode from './RectNode'
+
+// 带圆角的矩形
+class RectRadiusModel extends RectNode.model {
+ setAttributes() {
+ super.setAttributes()
+ this.radius = 20
+ }
+}
+export default {
+ type: 'rect-radius',
+ view: RectNode.view,
+ model: RectRadiusModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/TextNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/TextNode.js
new file mode 100644
index 0000000..b3a0911
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/basic/TextNode.js
@@ -0,0 +1,37 @@
+import { TextNodeModel, TextNode } from '@logicflow/core'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 文本节点
+class TextNewNode extends TextNode {
+}
+class TextNewModel extends TextNodeModel {
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ if (properties.backgroundColor) {
+ style.backgroundStyle = {
+ fill: properties.backgroundColor
+ }
+ }
+ return getTextStyleFunction(style, properties)
+ }
+
+ setAttributes() {
+ super.setAttributes()
+ if (!this.text.value) {
+ this.text.value = 'text'
+ }
+ }
+}
+
+export default {
+ type: 'pro-text',
+ view: TextNewNode,
+ model: TextNewModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Bezier.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Bezier.js
new file mode 100644
index 0000000..ecfc48e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Bezier.js
@@ -0,0 +1,26 @@
+import { BezierEdge, BezierEdgeModel } from '@logicflow/core'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 贝塞尔曲线
+class Model extends BezierEdgeModel {
+ constructor(data, graphModel) {
+ super(data, graphModel)
+ this.strokeWidth = 1
+ }
+ getTextStyle() {
+ const style = super.getTextStyle()
+ return getTextStyleFunction(style, this.properties)
+ }
+
+ getEdgeStyle() {
+ const attributes = super.getEdgeStyle()
+ const properties = this.properties
+ const style = getShapeStyleFuction(attributes, properties)
+ return { ...style, fill: 'none' }
+ }
+}
+export default {
+ type: 'pro-bezier',
+ view: BezierEdge,
+ model: Model
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Line.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Line.js
new file mode 100644
index 0000000..c5ef06e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Line.js
@@ -0,0 +1,26 @@
+import { LineEdge, LineEdgeModel } from '@logicflow/core'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 直线
+class Model extends LineEdgeModel {
+ constructor(data, graphModel) {
+ super(data, graphModel)
+ this.strokeWidth = 1
+ }
+ getTextStyle() {
+ const style = super.getTextStyle()
+ return getTextStyleFunction(style, this.properties)
+ }
+
+ getEdgeStyle() {
+ const attributes = super.getEdgeStyle()
+ const properties = this.properties
+ const style = getShapeStyleFuction(attributes, properties)
+ return { ...style, fill: 'none' }
+ }
+}
+export default {
+ type: 'pro-line',
+ view: LineEdge,
+ model: Model
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Polyline.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Polyline.js
new file mode 100644
index 0000000..86d53c2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/edge/Polyline.js
@@ -0,0 +1,26 @@
+import { PolylineEdge, PolylineEdgeModel } from '@logicflow/core'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 折线
+class Model extends PolylineEdgeModel {
+ constructor(data, graphModel) {
+ super(data, graphModel)
+ this.strokeWidth = 1
+ }
+ getTextStyle() {
+ const style = super.getTextStyle()
+ return getTextStyleFunction(style, this.properties)
+ }
+
+ getEdgeStyle() {
+ const attributes = super.getEdgeStyle()
+ const properties = this.properties
+ const style = getShapeStyleFuction(attributes, properties)
+ return { ...style, fill: 'none' }
+ }
+}
+export default {
+ type: 'pro-polyline',
+ view: PolylineEdge,
+ model: Model
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/getShapeStyleUtil.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/getShapeStyleUtil.js
new file mode 100644
index 0000000..9df8175
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/getShapeStyleUtil.js
@@ -0,0 +1,61 @@
+export const getShapeStyleFuction = (style, properties) => {
+ if (properties.backgroundColor) {
+ style.fill = properties.backgroundColor
+ }
+ if (properties.gradientColor && style.fill !== properties.gradientColor) {
+ style.fillGradient = properties.gradientColor
+ }
+ if (properties.borderColor) {
+ style.stroke = properties.borderColor
+ }
+ if (properties.borderWidth) {
+ style.strokeWidth = properties.borderWidth
+ }
+ if (properties.borderStyle) {
+ if (properties.borderStyle === 'solid') {
+ style.strokeDashArray = '0'
+ // nodeResize里的bug导致的,array小写了
+ style.strokeDasharray = '0'
+ }
+ if (properties.borderStyle === 'dashed') {
+ style.strokeDashArray = '3 3'
+ style.strokeDasharray = '3 3'
+ }
+ if (properties.borderStyle === 'dotted') {
+ style.strokeDashArray = '1 1'
+ style.strokeDasharray = '1 1'
+ }
+ if (properties.borderStyle === 'hidden') {
+ style.stroke = style.fill
+ }
+ }
+ return style
+}
+
+export const getTextStyleFunction = (style = {}, properties) => {
+ if (properties.fontColor) {
+ style.color = properties.fontColor
+ }
+ if (properties.fontSize) {
+ style.fontSize = properties.fontSize
+ }
+ if (properties.fontFamily) {
+ style.fontFamily = properties.fontFamily
+ }
+ if (properties.lineHeight) {
+ style.lineHeight = properties.lineHeight
+ }
+ if (properties.textAlign) {
+ style.textAlign = properties.textAlign
+ }
+ if (properties.fontWeight) {
+ style.fontWeight = properties.fontWeight
+ }
+ if (properties.textDecoration) {
+ style.textDecoration = properties.textDecoration
+ }
+ if (properties.fontStyle) {
+ style.fontStyle = properties.fontStyle
+ }
+ return style
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/icon/IconNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/icon/IconNode.js
new file mode 100644
index 0000000..5a6efd3
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/icon/IconNode.js
@@ -0,0 +1,44 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 左上角带ICON的节点
+class IconNode extends RectNode.view {
+ getImageHref() {
+ return
+ }
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const href = this.getImageHref()
+ const iconAttrs = {
+ x: x - 1 / 2 * width + 5,
+ y: y - 1 / 2 * height + 5, // icon在左上角
+ width: 25,
+ height: 18,
+ href,
+ // 根据宽高缩放
+ preserveAspectRatio: 'none meet'
+ }
+ const rectAttrs = {
+ ...style,
+ strokeWidth: 1,
+ rx: 5,
+ ry: 5,
+ x: x - 1 / 2 * width,
+ y: y - 1 / 2 * height,
+ width,
+ height
+ }
+ return h('g', {}, [
+ h('rect', { ...rectAttrs }),
+ h('image', { ...iconAttrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'image-node',
+ view: IconNode,
+ model: RectNode.model
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/icon/Message.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/icon/Message.js
new file mode 100644
index 0000000..a4f00e7
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/icon/Message.js
@@ -0,0 +1,14 @@
+import IconNode from './IconNode'
+
+// 左上角ICON为消息的节点
+class MessageNode extends IconNode.view {
+ getImageHref() {
+ return 'https://dpubstatic.udache.com/static/dpubimg/1TZgBoaq8G/message.png'
+ }
+}
+
+export default {
+ type: 'icon-message',
+ view: MessageNode,
+ model: IconNode.model
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Cloud.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Cloud.js
new file mode 100644
index 0000000..027ab02
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Cloud.js
@@ -0,0 +1,14 @@
+import ImageNode from './ImageNode'
+
+// 云形状的图片节点
+class CloudNode extends ImageNode.view {
+ getImageHref() {
+ return 'https://dpubstatic.udache.com/static/dpubimg/0oqFX1nvbD/cloud.png'
+ }
+}
+
+export default {
+ type: 'image-cloud',
+ view: CloudNode,
+ model: ImageNode.model
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/ImageNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/ImageNode.js
new file mode 100644
index 0000000..2ba9f9b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/ImageNode.js
@@ -0,0 +1,40 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 图片-基础节点
+class ImageModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 60
+ }
+}
+
+class ImageNode extends RectNode.view {
+ getImageHref() {
+ return
+ }
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const href = this.getImageHref()
+ const attrs = {
+ x: x - 1 / 2 * width,
+ y: y - 1 / 2 * height,
+ width,
+ height,
+ href,
+ // 根据宽高缩放
+ preserveAspectRatio: 'none meet'
+ }
+ return h('g', {}, [
+ h('image', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'image-node',
+ view: ImageNode,
+ model: ImageModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Setting.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Setting.js
new file mode 100644
index 0000000..c1a8a49
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Setting.js
@@ -0,0 +1,21 @@
+import ImageNode from './ImageNode'
+
+// 图片-设置节点
+class SettingModel extends ImageNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 60
+ this.height = 60
+ }
+}
+class SettingNode extends ImageNode.view {
+ getImageHref() {
+ return 'https://dpubstatic.udache.com/static/dpubimg/UzI4AFUcfO/setting.png'
+ }
+}
+
+export default {
+ type: 'image-setting',
+ view: SettingNode,
+ model: SettingModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Star.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Star.js
new file mode 100644
index 0000000..b87da97
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/Star.js
@@ -0,0 +1,14 @@
+import ImageNode from './ImageNode'
+
+// 图片-用户节点
+class UserNode extends ImageNode.view {
+ getImageHref() {
+ return 'https://dpubstatic.udache.com/static/dpubimg/-6Fd2uIoJ-/user.png'
+ }
+}
+
+export default {
+ type: 'image-user',
+ view: UserNode,
+ model: ImageNode.model
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/User.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/User.js
new file mode 100644
index 0000000..b87da97
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/image/User.js
@@ -0,0 +1,14 @@
+import ImageNode from './ImageNode'
+
+// 图片-用户节点
+class UserNode extends ImageNode.view {
+ getImageHref() {
+ return 'https://dpubstatic.udache.com/static/dpubimg/-6Fd2uIoJ-/user.png'
+ }
+}
+
+export default {
+ type: 'image-user',
+ view: UserNode,
+ model: ImageNode.model
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/index.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/index.js
new file mode 100644
index 0000000..9ce798d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/index.js
@@ -0,0 +1,82 @@
+// 基础图形
+import CircleNode from './basic/CircleNode'
+import RectNode from './basic/RectNode'
+import RectRadiusNode from './basic/RectRadiusNode'
+import EllipseNode from './basic/EllipseNode'
+import TextNode from './basic/TextNode'
+import DiamondNode from './basic/DiamondNode'
+// path绘制的个性化图形
+import CylindeNode from './path/CylindeNode'
+import TriangleNode from './path/TriangleNode'
+import ParallelogramNode from './path/ParallelogramNode'
+import ActorNode from './path/ActorNode'
+import StarNode from './path/Star'
+import PentagonNode from './path/PentagonNode'
+import HexagonNode from './path/HexagonNode'
+import SeptagonNode from './path/SeptagonNode'
+import HeptagonNode from './path/HeptagonNode'
+import TrapezoidNode from './path/TrapezoidNode'
+import CrossNode from './path/CrossNode'
+import MinusNode from './path/MinusNode'
+import TimesNode from './path/TimesNode'
+import DivideNode from './path/DivideNode'
+// 多边形绘制的箭头
+import LeftArrow from './arrow/LeftArrow'
+import RightArrow from './arrow/RightArrow'
+import HorizontalArrow from './arrow/HorizontalArrowNode'
+import UpArrow from './arrow/UpArrowNode'
+import DownArrow from './arrow/DownArrowNode'
+import VerticalArrow from './arrow/VerticalArrowNode'
+// image绘制图片节点
+import ImageSetting from './image/Setting'
+import ImageUser from './image/User'
+import ImageCloud from './image/Cloud'
+// image绘制左上角icon节点
+import IconMessage from './icon/Message'
+// 注册边
+import Ployline from './edge/Polyline'
+import Line from './edge/Line'
+import Bezier from './edge/Bezier'
+
+export const registerCustomElement = (lf) => {
+ // 注册基础图形
+ lf.register(CircleNode)
+ lf.register(RectNode)
+ lf.register(RectRadiusNode)
+ lf.register(EllipseNode)
+ lf.register(DiamondNode)
+ lf.register(TextNode)
+ // 注册path绘制的个性化图形
+ lf.register(CylindeNode)
+ lf.register(TriangleNode)
+ lf.register(ParallelogramNode)
+ lf.register(ActorNode)
+ lf.register(StarNode)
+ lf.register(PentagonNode)
+ lf.register(HexagonNode)
+ lf.register(SeptagonNode)
+ lf.register(HeptagonNode)
+ lf.register(TrapezoidNode)
+ lf.register(CrossNode)
+ lf.register(MinusNode)
+ lf.register(TimesNode)
+ lf.register(DivideNode)
+ // 注册多边形绘制的箭头
+ lf.register(LeftArrow)
+ lf.register(RightArrow)
+ lf.register(HorizontalArrow)
+ lf.register(UpArrow)
+ lf.register(DownArrow)
+ lf.register(VerticalArrow)
+ // 注册image绘制图片节点
+ lf.register(ImageSetting)
+ lf.register(ImageUser)
+ lf.register(ImageCloud)
+ // 注册image绘制左上角icon节点
+ lf.register(IconMessage)
+ // 注册边
+ lf.register(Ployline)
+ lf.register(Line)
+ lf.register(Bezier)
+}
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/ActorNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/ActorNode.js
new file mode 100644
index 0000000..718e511
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/ActorNode.js
@@ -0,0 +1,95 @@
+import { h } from '@logicflow/core'
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+// 人物
+class ActorModel extends RectResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 40
+ this.height = 80
+ }
+
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class ActorView extends RectResize.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ // 人物头部圆形
+ const ellipseAttrs = {
+ ...style,
+ cx: x,
+ cy: y - 3 / 8 * height,
+ rx: 1 / 4 * width,
+ ry: 1 / 8 * height,
+ width,
+ height
+ }
+ // 人物肩膀横线
+ const pathAAttrs = {
+ ...style,
+ d: `M ${x - 1 / 2 * width} ${y - 1 / 8 * height} L ${x + 1 / 2 * width} ${y - 1 / 8 * height}`
+ }
+ // 人物身体躯干竖线
+ const pathBAttrs = {
+ ...style,
+ d: `M ${x} ${y - 1 / 4 * height} L ${x} ${y + 1 / 5 * height}`
+ }
+ // 人物左腿斜线
+ const pathCAttrs = {
+ ...style,
+ d: `M ${x} ${y + 1 / 5 * height} L ${x - 1 / 2 * width} ${y + 1 / 2 * height}`
+ }
+ // 人物右腿斜线
+ const pathDAttrs = {
+ ...style,
+ d: `M ${x} ${y + 1 / 5 * height} L ${x + 1 / 2 * width} ${y + 1 / 2 * height}`
+ }
+ // 人物透明背景板
+ const bgAttrs = {
+ x: x - 1 / 5 * width,
+ y: y - 1 / 2 * height,
+ width: 2 / 5 * width,
+ height,
+ style: 'fill: transparent'
+ }
+ return h('g', {}, [
+ h('ellipse', {
+ ...ellipseAttrs
+ }),
+ h('path', {
+ ...pathAAttrs
+ }),
+ h('path', {
+ ...pathBAttrs
+ }),
+ h('path', {
+ ...pathCAttrs
+ }),
+ h('path', {
+ ...pathDAttrs
+ }),
+ h('rect', {
+ ...bgAttrs
+ })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'actor',
+ view: ActorView,
+ model: ActorModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/CrossNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/CrossNode.js
new file mode 100644
index 0000000..a9b4bbc
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/CrossNode.js
@@ -0,0 +1,65 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 加号
+class CrossModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class CrossView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 1 / 2 * width, y - 1 / 6 * height],
+ [x - 1 / 6 * width, y - 1 / 6 * height],
+ [x - 1 / 6 * width, y - 1 / 2 * height],
+ [x + 1 / 6 * width, y - 1 / 2 * height],
+ [x + 1 / 6 * width, y - 1 / 6 * height],
+ [x + 1 / 2 * width, y - 1 / 6 * height],
+ [x + 1 / 2 * width, y + 1 / 6 * height],
+ [x + 1 / 6 * width, y + 1 / 6 * height],
+ [x + 1 / 6 * width, y + 1 / 2 * height],
+ [x - 1 / 6 * width, y + 1 / 2 * height],
+ [x - 1 / 6 * width, y + 1 / 6 * height],
+ [x - 1 / 2 * width, y + 1 / 6 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'cross',
+ view: CrossView,
+ model: CrossModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/CylindeNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/CylindeNode.js
new file mode 100644
index 0000000..a719c7e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/CylindeNode.js
@@ -0,0 +1,92 @@
+import { h } from '@logicflow/core'
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 圆柱体
+class CylindeModel extends RectResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 60
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class CylindeView extends RectResize.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ // 圆柱体顶部椭圆
+ const ellipseAAttrs = {
+ ...style,
+ cx: x,
+ cy: y - 1 / 3 * height,
+ rx: 1 / 2 * width,
+ ry: 1 / 6 * height,
+ width,
+ height
+ }
+ // 圆柱体左直线
+ const pathAAttrs = {
+ ...style,
+ d: `M ${x - 1 / 2 * width} ${y - 1 / 3 * height} L ${x - 1 / 2 * width} ${y + 1 / 3 * height}`
+ }
+ // 圆柱体右直线
+ const pathBAttrs = {
+ ...style,
+ d: `M ${x + 1 / 2 * width} ${y - 1 / 3 * height} L ${x + 1 / 2 * width} ${y + 1 / 3 * height}`
+ }
+ // 圆柱体下椭圆
+ const ellipseBAttrs = {
+ ...style,
+ cx: x,
+ cy: y + 1 / 3 * height,
+ rx: 1 / 2 * width,
+ ry: 1 / 6 * height,
+ width,
+ height
+ }
+ // 圆柱体中间填充部分
+ const rectAttrs = {
+ ...style,
+ x: x - 1 / 2 * width,
+ y: y - 1 / 3 * height,
+ width,
+ height: 2 / 3 * height,
+ stroke: 'transparent'
+ }
+ return h('g', {}, [
+ h('ellipse', {
+ ...ellipseBAttrs
+ }),
+ h('rect', {
+ ...rectAttrs
+ }),
+ h('path', {
+ ...pathAAttrs
+ }),
+ h('path', {
+ ...pathBAttrs
+ }),
+ h('ellipse', {
+ ...ellipseAAttrs
+ })
+ ])
+ }
+}
+
+export default {
+ type: 'cylinde',
+ model: CylindeModel,
+ view: CylindeView
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/DivideNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/DivideNode.js
new file mode 100644
index 0000000..1fa2d98
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/DivideNode.js
@@ -0,0 +1,83 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 除号
+class DivideModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class DivideView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 1 / 2 * width, y - 1 / 8 * height],
+ [x + 1 / 2 * width, y - 1 / 8 * height],
+ [x + 1 / 2 * width, y + 1 / 8 * height],
+ [x - 1 / 2 * width, y + 1 / 8 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height
+ }
+
+ // 除号中间横线
+ const lineAttrs = {
+ ...attrs,
+ points: points.join(' ')
+ }
+
+ // 除号上圆点
+ const upEllipseAttrs = {
+ ...attrs,
+ cy: y - 3 / 8 * height,
+ cx: x,
+ rx: 1 / 8 * width,
+ ry: 1 / 8 * height
+ }
+
+ // 除号下圆点
+ const downEllipseAttrs = {
+ ...attrs,
+ cy: y + 3 / 8 * height,
+ cx: x,
+ rx: 1 / 8 * width,
+ ry: 1 / 8 * height
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...lineAttrs }),
+ h('ellipse', { ...upEllipseAttrs }),
+ h('ellipse', { ...downEllipseAttrs })
+ ])
+ }
+}
+
+export default {
+ type: 'divide',
+ view: DivideView,
+ model: DivideModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/HeptagonNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/HeptagonNode.js
new file mode 100644
index 0000000..b28d42b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/HeptagonNode.js
@@ -0,0 +1,61 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 五边形
+class HeptagonModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class HeptagonView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 0.205 * width, y - 0.5 * height],
+ [x + 0.205 * width, y - 0.5 * height],
+ [x + 0.5 * width, y - 0.205 * height],
+ [x + 0.5 * width, y + 0.205 * height],
+ [x + 0.205 * width, y + 0.5 * height],
+ [x - 0.205 * width, y + 0.5 * height],
+ [x - 0.5 * width, y + 0.205 * height],
+ [x - 0.5 * width, y - 0.205 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'heptagon',
+ view: HeptagonView,
+ model: HeptagonModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/HexagonNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/HexagonNode.js
new file mode 100644
index 0000000..a0e281f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/HexagonNode.js
@@ -0,0 +1,59 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 六边形
+class HexagonModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class HexagonView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 0.28 * width, y - 0.5 * height],
+ [x + 0.28 * width, y - 0.5 * height],
+ [x + 0.5 * width, y],
+ [x + 0.28 * width, y + 0.5 * height],
+ [x - 0.28 * width, y + 0.5 * height],
+ [x - 0.5 * width, y]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'hexagon',
+ view: HexagonView,
+ model: HexagonModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/MinusNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/MinusNode.js
new file mode 100644
index 0000000..5f29f1e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/MinusNode.js
@@ -0,0 +1,57 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 减号
+class MinusModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 20
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class MinusView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 1 / 2 * width, y - 1 / 2 * height],
+ [x + 1 / 2 * width, y - 1 / 2 * height],
+ [x + 1 / 2 * width, y + 1 / 2 * height],
+ [x - 1 / 2 * width, y + 1 / 2 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'minus',
+ view: MinusView,
+ model: MinusModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/ParallelogramNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/ParallelogramNode.js
new file mode 100644
index 0000000..96b07f8
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/ParallelogramNode.js
@@ -0,0 +1,57 @@
+import { h } from '@logicflow/core'
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 平行四边形
+class ParallelogramModel extends RectResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 100
+ this.height = 60
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class ParallelogramView extends RectResize.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - width / 2, y + height / 2],
+ [x - width / 5, y - height / 2],
+ [x + width / 2, y - height / 2],
+ [x + width / 5, y + height / 2]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'parallelogram',
+ view: ParallelogramView,
+ model: ParallelogramModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/PentagonNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/PentagonNode.js
new file mode 100644
index 0000000..0bf20aa
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/PentagonNode.js
@@ -0,0 +1,58 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 八边形
+class PentagonModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class PentagonView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 0.5 * width, y],
+ [x, y - 0.5 * height],
+ [x + 0.5 * width, y],
+ [x + 0.3 * width, y + 0.5 * height],
+ [x - 0.3 * width, y + 0.5 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'pentagon',
+ view: PentagonView,
+ model: PentagonModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/SeptagonNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/SeptagonNode.js
new file mode 100644
index 0000000..9ea030a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/SeptagonNode.js
@@ -0,0 +1,60 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 七边形
+class SeptagonModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class SeptagonView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x, y - 0.5 * height],
+ [x + 0.395 * width, y - 0.3 * height],
+ [x + 0.5 * width, y + 0.145 * height],
+ [x + 0.225 * width, y + 0.5 * height],
+ [x - 0.225 * width, y + 0.5 * height],
+ [x - 0.5 * width, y + 0.145 * height],
+ [x - 0.395 * width, y - 0.3 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'septagon',
+ view: SeptagonView,
+ model: SeptagonModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/Star.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/Star.js
new file mode 100644
index 0000000..28eaede
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/Star.js
@@ -0,0 +1,40 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 五角星
+class StarModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+}
+
+class StarView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const svgAttr = {
+ x: x - 1 / 2 * width,
+ y: y - 1 / 2 * height,
+ width,
+ height
+ }
+ const pathAAttrs = {
+ ...style,
+ d: 'm0.36922,13.46587l12.98695,0l4.01307,-13.36885l4.01307,13.36885l12.98694,0l-10.50664,8.26231l4.01327,13.36885l-10.50665,-8.26253l-10.50664,8.26253l4.01327,-13.36885l-10.50665,-8.26231l0,0z'
+ }
+
+ return h('svg', { ...svgAttr, viewBox: '0 0 37 37' }, [
+ h('path', {
+ ...pathAAttrs
+ })
+ ])
+ }
+}
+
+export default {
+ type: 'star',
+ view: StarView,
+ model: StarModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TimesNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TimesNode.js
new file mode 100644
index 0000000..6d67a2f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TimesNode.js
@@ -0,0 +1,65 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 乘号
+class TimesModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class TimesView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 1 / 2 * width, y - 1 / 3 * height],
+ [x - 1 / 3 * width, y - 1 / 2 * height],
+ [x, y - 1 / 6 * height],
+ [x + 1 / 3 * width, y - 1 / 2 * height],
+ [x + 1 / 2 * width, y - 1 / 3 * height],
+ [x + 1 / 6 * width, y],
+ [x + 1 / 2 * width, y + 1 / 3 * height],
+ [x + 1 / 3 * width, y + 1 / 2 * height],
+ [x, y + 1 / 6 * height],
+ [x - 1 / 3 * width, y + 1 / 2 * height],
+ [x - 1 / 2 * width, y + 1 / 3 * height],
+ [x - 1 / 6 * width, y]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'times',
+ view: TimesView,
+ model: TimesModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TrapezoidNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TrapezoidNode.js
new file mode 100644
index 0000000..3ffe197
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TrapezoidNode.js
@@ -0,0 +1,57 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 五边形
+class TrapezoidModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class TrapezoidView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 0.31 * width, y - 0.5 * height],
+ [x + 0.31 * width, y - 0.5 * height],
+ [x + 0.5 * width, y + 0.5 * height],
+ [x - 0.5 * width, y + 0.5 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'trapezoid',
+ view: TrapezoidView,
+ model: TrapezoidModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TriangleNode.js b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TriangleNode.js
new file mode 100644
index 0000000..67ff9e3
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/components/node/path/TriangleNode.js
@@ -0,0 +1,47 @@
+import { h } from '@logicflow/core'
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 三角形
+class TriangleModel extends RectResize.model {
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class TriangleView extends RectResize.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [x - width / 2, y + height / 2],
+ [x - width / 2, y - height / 2],
+ [x + width / 2, y]
+ ]
+ }
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'triangle',
+ view: TriangleView,
+ model: TriangleModel
+}
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/constant/index.js b/acs/nladmin-ui/src/views/acs/stage/editor/constant/index.js
new file mode 100644
index 0000000..710a725
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/constant/index.js
@@ -0,0 +1,69 @@
+export const shortStyles = [
+ {
+ backgroundColor: 'rgb(255, 255, 255)',
+ borderWidth: '1px',
+ borderColor: 'rgb(42, 42, 42)'
+ },
+ {
+ backgroundColor: 'rgb(245, 245, 245)',
+ borderWidth: '1px',
+ borderColor: 'rgb(102, 102, 102)'
+ },
+ {
+ backgroundColor: 'rgb(218, 232, 252)',
+ borderWidth: '1px',
+ borderColor: 'rgb(108, 142, 191)'
+ },
+ {
+ backgroundColor: 'rgb(213, 232, 212)',
+ borderWidth: '1px',
+ borderColor: 'rgb(130, 179, 102)'
+ },
+ {
+ backgroundColor: 'rgb(255, 230, 204)',
+ borderWidth: '1px',
+ borderColor: 'rgb(215, 155, 0)'
+ },
+ {
+ backgroundColor: 'rgb(255, 242, 204)',
+ borderWidth: '1px',
+ borderColor: 'rgb(214, 182, 86)'
+ },
+ {
+ backgroundColor: 'rgb(248, 206, 204)',
+ borderWidth: '1px',
+ borderColor: 'rgb(184, 84, 80)'
+ },
+ {
+ backgroundColor: 'rgb(220, 210, 230)',
+ borderWidth: '1px',
+ borderColor: 'rgb(150, 115, 166)'
+ }
+]
+
+export const borderStyles = [
+ {
+ value: 'solid'
+ },
+ {
+ value: 'dashed'
+ },
+ {
+ value: 'dotted'
+ }
+]
+
+export const fontFamilies = [
+ {
+ value: 'Arial'
+ },
+ {
+ value: 'Verdana'
+ },
+ {
+ value: 'Georgia'
+ },
+ {
+ value: 'Times New Roman'
+ }
+]
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/index.vue b/acs/nladmin-ui/src/views/acs/stage/editor/index.vue
new file mode 100644
index 0000000..f85330e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/index.vue
@@ -0,0 +1,393 @@
+
+
+
+
+
+ 舞台:
+
+
+
+ 宽度(px):
+
+ 单元格数:
+
+ 保存
+ 清空
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 设备编号:{{ item.device_code }}
+
+
+
+
+
![]()
+
![]()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ∠0°
+ ∠90°
+ ∠180°
+ ∠270°
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ∠0°
+ ∠90°
+ ∠180°
+ ∠270°
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/editor/index2.vue b/acs/nladmin-ui/src/views/acs/stage/editor/index2.vue
new file mode 100644
index 0000000..36004f5
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/editor/index2.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/image/index.vue b/acs/nladmin-ui/src/views/acs/stage/image/index.vue
new file mode 100644
index 0000000..5bfa1af
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/image/index.vue
@@ -0,0 +1,311 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/stage/index.vue b/acs/nladmin-ui/src/views/acs/stage/index.vue
new file mode 100644
index 0000000..8a0137f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/stage/index.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/task/deviceAskTask/index.vue b/acs/nladmin-ui/src/views/acs/task/deviceAskTask/index.vue
new file mode 100644
index 0000000..fe2e8aa
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/task/deviceAskTask/index.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提交
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/task/index.vue b/acs/nladmin-ui/src/views/acs/task/index.vue
new file mode 100644
index 0000000..8302850
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/task/index.vue
@@ -0,0 +1,701 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+ 同步
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label.task_type[scope.row.task_type] }}
+
+
+
+
+
+
+ 就绪
+ 执行中
+ 完成
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 完成
+ 取消
+ 创建指令
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/task/taskFeedback/index.vue b/acs/nladmin-ui/src/views/acs/task/taskFeedback/index.vue
new file mode 100644
index 0000000..3bd74f9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/task/taskFeedback/index.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 重置
+ 作废
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/acs/test/hailiang/index.vue b/acs/nladmin-ui/src/views/acs/test/hailiang/index.vue
new file mode 100644
index 0000000..47cd2a6
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/test/hailiang/index.vue
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+ 初始化
+ 触发打印
+ 加载模板
+
+
+
+
+
+
+ 发送BUFFERDATA缓存指令
+ 清空缓存
+
+
+
+
+ 发送SETTEXT指令
+ 事务发送
+
+ 发送打印
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditDownModal.vue b/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditDownModal.vue
new file mode 100644
index 0000000..47f758a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditDownModal.vue
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditDownTable.vue b/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditDownTable.vue
new file mode 100644
index 0000000..994681b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditDownTable.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditPopupModal.vue b/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditPopupModal.vue
new file mode 100644
index 0000000..544a6ad
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/components/EditPopupModal.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterComplex.vue b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterComplex.vue
new file mode 100644
index 0000000..599c27c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterComplex.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterContent.vue b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterContent.vue
new file mode 100644
index 0000000..ceb296b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterContent.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterExcel.vue b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterExcel.vue
new file mode 100644
index 0000000..7714cff
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterExcel.vue
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+ (全选)
+
+ -
+
+ {{ val }}
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterInput.vue b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterInput.vue
new file mode 100644
index 0000000..216ff38
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FilterInput.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/components/FormSimple.vue b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FormSimple.vue
new file mode 100644
index 0000000..e243e59
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/components/FormSimple.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/content.js b/acs/nladmin-ui/src/views/components/VxeTableRender/content.js
new file mode 100644
index 0000000..9853dec
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/content.js
@@ -0,0 +1,28 @@
+import VXETable from 'vxe-table'
+
+// 创建一个简单的展开内容渲染
+VXETable.renderer.add('MyExpand', {
+ renderExpand(h, renderOpts, params) {
+ const { row } = params
+ return [
+
+ -
+ ID:
+ {row.id}
+
+ -
+ Name:
+ {row.name}
+
+ -
+ UpdateTime:
+ {row.updateTime}
+
+ -
+ CreateTime:
+ {row.createTime}
+
+
+ ]
+ }
+})
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/default.js b/acs/nladmin-ui/src/views/components/VxeTableRender/default.js
new file mode 100644
index 0000000..98aa48e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/default.js
@@ -0,0 +1,12 @@
+import VXETable from 'vxe-table'
+// 创建一个简单的超链接渲染
+VXETable.renderer.add('MyLink', {
+ // 默认显示模板
+ renderDefault(h, renderOpts, params) {
+ const { row, column } = params
+ const { events } = renderOpts
+ return [
+ events.click(params)}>{row[column.property]}
+ ]
+ }
+})
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/edit.js b/acs/nladmin-ui/src/views/components/VxeTableRender/edit.js
new file mode 100644
index 0000000..571caaa
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/edit.js
@@ -0,0 +1,57 @@
+import Vue from 'vue'
+import VXETable from 'vxe-table'
+import EditDownTable from './components/EditDownTable.vue'
+import EditPopupModal from './components/EditPopupModal.vue'
+import EditDownModal from './components/EditDownModal.vue'
+
+Vue.component(EditDownTable.name, EditDownTable)
+Vue.component(EditPopupModal.name, EditPopupModal)
+Vue.component(EditDownModal.name, EditDownModal)
+
+// 创建一个简单的输入框渲染
+VXETable.renderer.add('MyInput', {
+ // 激活时自动聚焦
+ autofocus: '.my-cell',
+ // 可编辑激活模板
+ renderEdit(h, renderOpts, { row, column }) {
+ return [
+
+ ]
+ },
+ // 可编辑显示模板
+ renderCell(h, renderOpts, { row, column }) {
+ return [
+ { row[column.property] }
+ ]
+ }
+})
+
+// 创建一个下拉表格渲染
+VXETable.renderer.add('EditDownTable', {
+ autofocus: '.vxe-input--inner',
+ renderEdit(h, renderOpts, params) {
+ return [
+
+ ]
+ }
+})
+
+// 创建一个弹窗渲染
+VXETable.renderer.add('EditPopupModal', {
+ autofocus: '.vxe-input--inner',
+ renderEdit(h, renderOpts, params) {
+ return [
+
+ ]
+ }
+})
+
+// 创建一个复杂的组合渲染
+VXETable.renderer.add('EditDownModal', {
+ autofocus: '.vxe-input--inner',
+ renderEdit(h, renderOpts, params) {
+ return [
+
+ ]
+ }
+})
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/empty.js b/acs/nladmin-ui/src/views/components/VxeTableRender/empty.js
new file mode 100644
index 0000000..74fabbe
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/empty.js
@@ -0,0 +1,13 @@
+import VXETable from 'vxe-table'
+// 创建一个简单的空内容渲染
+VXETable.renderer.add('NotData', {
+ // 空内容模板
+ renderEmpty() {
+ return [
+
+
+ 亲,没有更多数据了!
+
+ ]
+ }
+})
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/filter.js b/acs/nladmin-ui/src/views/components/VxeTableRender/filter.js
new file mode 100644
index 0000000..6ce21bf
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/filter.js
@@ -0,0 +1,123 @@
+import Vue from 'vue'
+import VXETable from 'vxe-table'
+import FilterInput from './components/FilterInput.vue'
+import FilterContent from './components/FilterContent.vue'
+import FilterComplex from './components/FilterComplex.vue'
+import FilterExcel from './components/FilterExcel.vue'
+
+Vue.component(FilterInput.name, FilterInput)
+Vue.component(FilterContent.name, FilterContent)
+Vue.component(FilterComplex.name, FilterComplex)
+Vue.component(FilterExcel.name, FilterExcel)
+
+// 创建一个简单的输入框筛选
+VXETable.renderer.add('FilterInput', {
+ // 筛选模板
+ renderFilter(h, renderOpts, params) {
+ return [
+
+ ]
+ },
+ // 重置数据方法
+ filterResetMethod({ options }) {
+ options.forEach(option => {
+ option.data = ''
+ })
+ },
+ // 重置筛选复原方法(当未点击确认时,该选项将被恢复为默认值)
+ filterRecoverMethod({ option }) {
+ option.data = ''
+ },
+ // 筛选方法
+ filterMethod({ option, row, column }) {
+ const { data } = option
+ const cellValue = row[column.property]
+ if (cellValue) {
+ return cellValue.indexOf(data) > -1
+ }
+ return false
+ }
+})
+
+// 创建一个条件的渲染器
+VXETable.renderer.add('FilterComplex', {
+ // 不显示底部按钮,使用自定义的按钮
+ isFooter: false,
+ // 筛选模板
+ renderFilter(h, renderOpts, params) {
+ return [
+
+ ]
+ },
+ // 重置数据方法
+ filterResetMethod({ options }) {
+ options.forEach(option => {
+ option.data = { type: 'has', name: '' }
+ })
+ },
+ // 筛选数据方法
+ filterMethod({ option, row, column }) {
+ const cellValue = row[column.property]
+ const { name } = option.data
+ if (cellValue) {
+ return cellValue.indexOf(name) > -1
+ }
+ return false
+ }
+})
+
+// 创建一个支持列内容的筛选
+VXETable.renderer.add('FilterContent', {
+ // 不显示底部按钮,使用自定义的按钮
+ isFooter: false,
+ // 筛选模板
+ renderFilter(h, renderOpts, params) {
+ return [
+
+ ]
+ },
+ // 重置数据方法
+ filterResetMethod({ options }) {
+ options.forEach(option => {
+ option.data = { vals: [], sVal: '' }
+ })
+ },
+ // 筛选数据方法
+ filterMethod({ option, row, column }) {
+ const { vals } = option.data
+ const cellValue = row[column.property]
+ return vals.includes(cellValue)
+ }
+})
+
+// 创建一个实现Excel的筛选器
+VXETable.renderer.add('FilterExcel', {
+ // 不显示底部按钮,使用自定义的按钮
+ isFooter: false,
+ // 筛选模板
+ renderFilter(h, renderOpts, params) {
+ return [
+
+ ]
+ },
+ // 重置数据方法
+ filterResetMethod({ options }) {
+ options.forEach(option => {
+ option.data = { vals: [], sVal: '', fMenu: '', f1Type: '', f1Val: '', fMode: 'and', f2Type: '', f2Val: '' }
+ })
+ },
+ // 筛选数据方法
+ filterMethod({ option, row, column }) {
+ const cellValue = row[column.property]
+ const { vals, f1Type, f1Val } = option.data
+ if (cellValue) {
+ if (f1Type) {
+ return cellValue.indexOf(f1Val) > -1
+ } else if (vals.length) {
+ // 通过指定值筛选
+ return vals.includes(cellValue)
+ }
+ }
+ return false
+ }
+})
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/form.js b/acs/nladmin-ui/src/views/components/VxeTableRender/form.js
new file mode 100644
index 0000000..ac17fa2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/form.js
@@ -0,0 +1,23 @@
+import VXETable from 'vxe-table'
+// 创建一个简单的表单-输入框渲染
+VXETable.renderer.add('FormItemInput', {
+ // 项内容模板
+ renderItemContent(h, renderOpts, params) {
+ const { data, property } = params
+ const { props } = renderOpts
+ return [
+
+ ]
+ }
+})
+
+// 创建一个简单的表单-按钮组渲染
+VXETable.renderer.add('FormItemButtonGroup', {
+ // 项内容模板
+ renderItemContent() {
+ return [
+ 查询,
+ 重置
+ ]
+ }
+})
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/index.js b/acs/nladmin-ui/src/views/components/VxeTableRender/index.js
new file mode 100644
index 0000000..8d187ac
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/index.js
@@ -0,0 +1,7 @@
+import './default'
+import './filter'
+import './edit'
+import './content'
+import './toolbar'
+import './form'
+import './empty'
diff --git a/acs/nladmin-ui/src/views/components/VxeTableRender/toolbar.js b/acs/nladmin-ui/src/views/components/VxeTableRender/toolbar.js
new file mode 100644
index 0000000..19fadb9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/VxeTableRender/toolbar.js
@@ -0,0 +1,29 @@
+import VXETable from 'vxe-table'
+// 创建一个简单的工具栏-左侧按钮渲染
+VXETable.renderer.add('ToolbarButtonDownload', {
+ renderToolbarButton(h, renderOpts, params) {
+ const { events = {}} = renderOpts
+ const { button } = params
+ return [
+ {
+ events.click(button)
+ }
+ }>
+ ]
+ }
+})
+
+// 创建一个简单的工具栏-右侧工具渲染
+VXETable.renderer.add('ToolbarToolPrint', {
+ renderToolbarTool(h, renderOpts, params) {
+ const { $table } = params
+ return [
+ {
+ $table.print()
+ }
+ }>
+ ]
+ }
+})
diff --git a/acs/nladmin-ui/src/views/components/excel/upload-excel.vue b/acs/nladmin-ui/src/views/components/excel/upload-excel.vue
new file mode 100644
index 0000000..75f7634
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/excel/upload-excel.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/icons/element-icons.js b/acs/nladmin-ui/src/views/components/icons/element-icons.js
new file mode 100644
index 0000000..df72201
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/icons/element-icons.js
@@ -0,0 +1,74 @@
+const elementIcons = [
+ 'info',
+ 'error',
+ 'success',
+ 'warning',
+ 'question',
+ 'back',
+ 'arrow-left',
+ 'arrow-down',
+ 'arrow-right',
+ 'arrow-up',
+ 'caret-left',
+ 'caret-bottom',
+ 'caret-top',
+ 'caret-right',
+ 'd-arrow-left',
+ 'd-arrow-right',
+ 'minus',
+ 'plus',
+ 'remove',
+ 'circle-plus',
+ 'remove-outline',
+ 'circle-plus-outline',
+ 'close',
+ 'check',
+ 'circle-close',
+ 'circle-check',
+ 'circle-close-outline',
+ 'circle-check-outline',
+ 'zoom-out',
+ 'zoom-in',
+ 'd-caret',
+ 'sort',
+ 'sort-down',
+ 'sort-up',
+ 'tickets',
+ 'document',
+ 'goods',
+ 'sold-out',
+ 'news',
+ 'message',
+ 'date',
+ 'printer',
+ 'time',
+ 'bell',
+ 'mobile-phone',
+ 'service',
+ 'view',
+ 'menu',
+ 'more',
+ 'more-outline',
+ 'star-on',
+ 'star-off',
+ 'location',
+ 'location-outline',
+ 'phone',
+ 'phone-outline',
+ 'picture',
+ 'picture-outline',
+ 'delete',
+ 'search',
+ 'edit',
+ 'edit-outline',
+ 'rank',
+ 'refresh',
+ 'share',
+ 'setting',
+ 'upload',
+ 'upload2',
+ 'download',
+ 'loading'
+]
+
+export default elementIcons
diff --git a/acs/nladmin-ui/src/views/components/icons/index.vue b/acs/nladmin-ui/src/views/components/icons/index.vue
new file mode 100644
index 0000000..d060173
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/icons/index.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+ {{ generateIconCode(item) }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+ {{ generateElementIconCode(item) }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/components/icons/svg-icons.js b/acs/nladmin-ui/src/views/components/icons/svg-icons.js
new file mode 100644
index 0000000..724cd8e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/components/icons/svg-icons.js
@@ -0,0 +1,10 @@
+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/acs/nladmin-ui/src/views/dashboard/LineChart.vue b/acs/nladmin-ui/src/views/dashboard/LineChart.vue
new file mode 100644
index 0000000..e654168
--- /dev/null
+++ b/acs/nladmin-ui/src/views/dashboard/LineChart.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/dashboard/PanelGroup.vue b/acs/nladmin-ui/src/views/dashboard/PanelGroup.vue
new file mode 100644
index 0000000..589236e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/dashboard/PanelGroup.vue
@@ -0,0 +1,181 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/dashboard/mixins/resize.js b/acs/nladmin-ui/src/views/dashboard/mixins/resize.js
new file mode 100644
index 0000000..234953b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/dashboard/mixins/resize.js
@@ -0,0 +1,55 @@
+import { debounce } from '@/utils'
+
+export default {
+ data() {
+ return {
+ $_sidebarElm: null,
+ $_resizeHandler: null
+ }
+ },
+ mounted() {
+ this.$_resizeHandler = debounce(() => {
+ if (this.chart) {
+ this.chart.resize()
+ }
+ }, 100)
+ this.$_initResizeEvent()
+ this.$_initSidebarResizeEvent()
+ },
+ beforeDestroy() {
+ this.$_destroyResizeEvent()
+ this.$_destroySidebarResizeEvent()
+ },
+ // to fixed bug when cached by keep-alive
+ // https://github.com/PanJiaChen/vue-element-admin/issues/2116
+ activated() {
+ this.$_initResizeEvent()
+ this.$_initSidebarResizeEvent()
+ },
+ deactivated() {
+ this.$_destroyResizeEvent()
+ this.$_destroySidebarResizeEvent()
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_initResizeEvent() {
+ window.addEventListener('resize', this.$_resizeHandler)
+ },
+ $_destroyResizeEvent() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ },
+ $_sidebarResizeHandler(e) {
+ if (e.propertyName === 'width') {
+ this.$_resizeHandler()
+ }
+ },
+ $_initSidebarResizeEvent() {
+ this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+ this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+ },
+ $_destroySidebarResizeEvent() {
+ this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+ }
+ }
+}
diff --git a/acs/nladmin-ui/src/views/features/401.vue b/acs/nladmin-ui/src/views/features/401.vue
new file mode 100644
index 0000000..8a3b69e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/features/401.vue
@@ -0,0 +1,89 @@
+
+
+
+ 返回
+
+
+
+
+ Oops!
+
+ 你没有权限去该页面
+ 如有不满请联系你领导
+
+ - 或者你可以去:
+ -
+
+ 回首页
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/features/404.vue b/acs/nladmin-ui/src/views/features/404.vue
new file mode 100644
index 0000000..237d81f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/features/404.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
OOPS!
+
{{ message }}
+
请检查您输入的网址是否正确,请点击以下按钮返回主页或者发送错误报告
+
返回首页
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/features/redirect.vue b/acs/nladmin-ui/src/views/features/redirect.vue
new file mode 100644
index 0000000..db4c1d6
--- /dev/null
+++ b/acs/nladmin-ui/src/views/features/redirect.vue
@@ -0,0 +1,12 @@
+
diff --git a/acs/nladmin-ui/src/views/generator/config.vue b/acs/nladmin-ui/src/views/generator/config.vue
new file mode 100644
index 0000000..98f0286
--- /dev/null
+++ b/acs/nladmin-ui/src/views/generator/config.vue
@@ -0,0 +1,325 @@
+
+
+
+
+
+
+ 字段配置:{{ tableName }}
+ 保存&生成
+ 保存
+
+ 同步
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 生成配置
+ 保存
+
+
+
+
+ 类上面的作者名称
+
+
+
+ 模块的名称,请选择项目中已存在的模块
+
+
+
+ 项目包的名称,生成的代码放到哪个包里面
+
+
+
+ 接口的名称,用于控制器与接口文档中
+
+
+
+ 输入views文件夹下的目录,不存在即创建
+
+
+
+
+
+
+
+ 默认不去除表前缀,可自定义
+
+
+
+ 是
+ 否
+
+ 谨防误操作,请慎重选择
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/generator/index.vue b/acs/nladmin-ui/src/views/generator/index.vue
new file mode 100644
index 0000000..8bdf5a8
--- /dev/null
+++ b/acs/nladmin-ui/src/views/generator/index.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+ 预览
+
+
+ 下载
+
+
+ 配置
+
+
+ 生成
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/generator/preview.vue b/acs/nladmin-ui/src/views/generator/preview.vue
new file mode 100644
index 0000000..d5b55f8
--- /dev/null
+++ b/acs/nladmin-ui/src/views/generator/preview.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/home.vue b/acs/nladmin-ui/src/views/home.vue
new file mode 100644
index 0000000..c2f031b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/home.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/login.vue b/acs/nladmin-ui/src/views/login.vue
new file mode 100644
index 0000000..caa6d06
--- /dev/null
+++ b/acs/nladmin-ui/src/views/login.vue
@@ -0,0 +1,209 @@
+
+
+
+
+ {{title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+ 记住我
+
+
+
+ 登 录
+ 登 录 中...
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/loki/api/loki.js b/acs/nladmin-ui/src/views/loki/api/loki.js
new file mode 100644
index 0000000..f71149d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/loki/api/loki.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+export function getLogData(param) {
+ return request({
+ url: 'api/loki/logs',
+ method: 'post',
+ data: param
+ })
+}
+
+export function labelsValues() {
+ return request({
+ url: 'api/loki/labels/values',
+ method: 'get'
+ })
+}
+
+export default { getLogData, labelsValues }
diff --git a/acs/nladmin-ui/src/views/loki/view/index.vue b/acs/nladmin-ui/src/views/loki/view/index.vue
new file mode 100644
index 0000000..8f96e2b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/loki/view/index.vue
@@ -0,0 +1,452 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ backward
+ forward
+
+
+
+
+
+
+
+
+
+
+ 查询{{ runStatu }}
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/interfaceLog/index.vue b/acs/nladmin-ui/src/views/monitor/interfaceLog/index.vue
new file mode 100644
index 0000000..3999c89
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/interfaceLog/index.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+ 清空
+
+
+
+
+
+
+
+
+
+ {{ props.row.method }}
+
+
+ {{ props.row.params }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.time }}ms
+ {{ scope.row.time }}ms
+ {{ scope.row.time }}ms
+
+
+
+
+ {{ parseTime(scope.row.create_time) }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/interfaceLog/interfaceLog.js b/acs/nladmin-ui/src/views/monitor/interfaceLog/interfaceLog.js
new file mode 100644
index 0000000..fed5509
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/interfaceLog/interfaceLog.js
@@ -0,0 +1,22 @@
+import request from '@/utils/request'
+
+export function add(data) {
+ return request({
+ url: 'api/interfaceLog',
+ method: 'post',
+ data
+ })
+}
+export function delLogs() {
+ return request({
+ url: 'api/interfaceLog/delLogs',
+ method: 'delete'
+ })
+}
+export function getLogTypeList() {
+ return request({
+ url: 'api/interfaceLog/logTypeList',
+ method: 'get'
+ })
+}
+export default { add, delLogs, getLogTypeList }
diff --git a/acs/nladmin-ui/src/views/monitor/interfaceLog/search.vue b/acs/nladmin-ui/src/views/monitor/interfaceLog/search.vue
new file mode 100644
index 0000000..e1eb1fa
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/interfaceLog/search.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/log/errorLog.vue b/acs/nladmin-ui/src/views/monitor/log/errorLog.vue
new file mode 100644
index 0000000..ae322c6
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/log/errorLog.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+ 清空
+
+
+
+
+
+
+
+
+
+ {{ props.row.method }}
+
+
+ {{ props.row.params }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 查看详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/log/index.vue b/acs/nladmin-ui/src/views/monitor/log/index.vue
new file mode 100644
index 0000000..c06463e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/log/index.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+ 清空
+
+
+
+
+
+
+
+
+
+ {{ props.row.method }}
+
+
+ {{ props.row.params }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.time }}ms
+ {{ scope.row.time }}ms
+ {{ scope.row.time }}ms
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/log/search.vue b/acs/nladmin-ui/src/views/monitor/log/search.vue
new file mode 100644
index 0000000..cc9f175
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/log/search.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/lucene/index.vue b/acs/nladmin-ui/src/views/monitor/lucene/index.vue
new file mode 100644
index 0000000..49b7e27
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/lucene/index.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+ 清空
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/lucene/search.vue b/acs/nladmin-ui/src/views/monitor/lucene/search.vue
new file mode 100644
index 0000000..bfb9c19
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/lucene/search.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/lucene/time.vue b/acs/nladmin-ui/src/views/monitor/lucene/time.vue
new file mode 100644
index 0000000..36d504a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/lucene/time.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/online/index.vue b/acs/nladmin-ui/src/views/monitor/online/index.vue
new file mode 100644
index 0000000..ccafe3e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/online/index.vue
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.loginTime) }}
+
+
+
+
+
+ 确定强制退出该用户吗?
+
+ 取消
+ 确定
+
+ 强退
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/server/index.vue b/acs/nladmin-ui/src/views/monitor/server/index.vue
new file mode 100644
index 0000000..920861e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/server/index.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+ 系统:{{ data.sys.os }}
+
+
+ IP:{{ data.sys.ip }}
+
+
+ 项目已不间断运行:{{ data.sys.day }}
+
+
+
+
+
+
+ 状态
+
+
+
+ CPU使用率
+
+
+
+ {{ data.cpu.name }}
+
+
+ {{ data.cpu.package }}
+
+
+ {{ data.cpu.core }}
+
+
+ {{ data.cpu.logic }}
+
+
+
+
+
+
+
+
+
+ 内存使用率
+
+
+
+ 总量:{{ data.memory.total }}
+
+
+ 已使用:{{ data.memory.used }}
+
+
+ 空闲:{{ data.memory.available }}
+
+
+
+
+
+
+
+
+
+ 交换区使用率
+
+
+
+ 总量:{{ data.swap.total }}
+
+
+ 已使用:{{ data.swap.used }}
+
+
+ 空闲:{{ data.swap.available }}
+
+
+
+
+
+
+
+
+
+ 磁盘使用率
+
+
+
+
+ 总量:{{ data.disk.total }}
+
+
+ 空闲:{{ data.disk.available }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CPU使用率监控
+
+
+
+
+
+
+
+
+
+ 内存使用率监控
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/monitor/sql/index.vue b/acs/nladmin-ui/src/views/monitor/sql/index.vue
new file mode 100644
index 0000000..0ed9034
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/sql/index.vue
@@ -0,0 +1,16 @@
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/auto/index.vue b/acs/nladmin-ui/src/views/system/auto/index.vue
new file mode 100644
index 0000000..d2b85ae
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/auto/index.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启动
+
+ 确定停止该线程吗?
+
+ 取消
+ 确定
+
+ 停止
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/auto/log.vue b/acs/nladmin-ui/src/views/system/auto/log.vue
new file mode 100644
index 0000000..8f0ddf2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/auto/log.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
搜索
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+ 查看详情
+
+
+
+
+
+ {{ scope.row.isSuccess ? '成功' : '失败' }}
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/components/CodeTypeDialog.vue b/acs/nladmin-ui/src/views/system/build/components/CodeTypeDialog.vue
new file mode 100644
index 0000000..6df1e03
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/components/CodeTypeDialog.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+
+
+ 确定
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/components/DraggableItem.vue b/acs/nladmin-ui/src/views/system/build/components/DraggableItem.vue
new file mode 100644
index 0000000..1a6a271
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/components/DraggableItem.vue
@@ -0,0 +1,120 @@
+
diff --git a/acs/nladmin-ui/src/views/system/build/components/FormDrawer.vue b/acs/nladmin-ui/src/views/system/build/components/FormDrawer.vue
new file mode 100644
index 0000000..18c2ab3
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/components/FormDrawer.vue
@@ -0,0 +1,358 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ template
+
+
+
+
+
+
+ script
+
+
+
+
+
+
+ css
+
+
+
+
+
+
+
+
+
+
+
+ 刷新
+
+
+
+ 导出vue文件
+
+
+
+ 复制代码
+
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/components/IconsDialog.vue b/acs/nladmin-ui/src/views/system/build/components/IconsDialog.vue
new file mode 100644
index 0000000..5985857
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/components/IconsDialog.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/components/JsonDrawer.vue b/acs/nladmin-ui/src/views/system/build/components/JsonDrawer.vue
new file mode 100644
index 0000000..93786d5
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/components/JsonDrawer.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 刷新
+
+
+
+ 复制JSON
+
+
+
+ 导出JSON文件
+
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/components/ResourceDialog.vue b/acs/nladmin-ui/src/views/system/build/components/ResourceDialog.vue
new file mode 100644
index 0000000..831487d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/components/ResourceDialog.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+ jQuery1.8.3
+
+
+ http-vue-loader
+
+
+ 添加其他
+
+
+
+
+ 取消
+
+
+ 确定
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/components/RightPanel.vue b/acs/nladmin-ui/src/views/system/build/components/RightPanel.vue
new file mode 100644
index 0000000..bbbb638
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/components/RightPanel.vue
@@ -0,0 +1,1047 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.__config__.label }}
+
+
+
+
+
+
+
+
+ {{ activeData.__config__.componentName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 默认
+
+
+ 右侧
+
+
+
+
+
+
+ 个字符
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text
+
+
+ picture
+
+
+ picture-card
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选项
+
+
+
+
+
+ 添加选项
+
+
+
+
+
+
+ 选项
+
+
+
+ 动态数据
+
+
+ 静态数据
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加父级
+
+
+
+
+
+
+
+
+ 默认
+
+
+ 按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 中等
+
+
+ 较小
+
+
+ 迷你
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 布局结构树
+
+
+
+
+ {{ node.label }}
+
+
+
+
+
+
+ 正则校验
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加规则
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 中等
+
+
+ 较小
+
+
+ 迷你
+
+
+
+
+
+
+ 左对齐
+
+
+ 右对齐
+
+
+ 顶部对齐
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/components/TreeNodeDialog.vue b/acs/nladmin-ui/src/views/system/build/components/TreeNodeDialog.vue
new file mode 100644
index 0000000..c64d45a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/components/TreeNodeDialog.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确定
+
+
+ 取消
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/config/pluginsConfig.js b/acs/nladmin-ui/src/views/system/build/config/pluginsConfig.js
new file mode 100644
index 0000000..f7d62e4
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/config/pluginsConfig.js
@@ -0,0 +1,13 @@
+const CDN = 'https://lib.baomitu.com/' // CDN Homepage: https://cdn.baomitu.com/
+// const publicPath = process.env.BASE_URL
+
+function splicingPluginUrl(PluginName, version, fileName) {
+ return `${CDN}${PluginName}/${version}/${fileName}`
+}
+
+export default {
+ beautifierUrl: splicingPluginUrl('js-beautify', '1.13.5', 'beautifier.min.js'),
+ monacoEditorUrl: splicingPluginUrl('monaco-editor', '0.19.3', 'min/vs'), // 使用 monaco-editor CDN 链接
+ // monacoEditorUrl: `${publicPath}libs/monaco-editor/vs`, // 使用 monaco-editor 本地代码
+ tinymceUrl: splicingPluginUrl('tinymce', '5.7.0', 'tinymce.min.js')
+}
diff --git a/acs/nladmin-ui/src/views/system/build/css/mixin.scss b/acs/nladmin-ui/src/views/system/build/css/mixin.scss
new file mode 100644
index 0000000..a3e9aa8
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/css/mixin.scss
@@ -0,0 +1,33 @@
+@mixin action-bar {
+ .action-bar {
+ height: 33px;
+ background: #f2fafb;
+ padding: 0 15px;
+ box-sizing: border-box;
+
+ .bar-btn {
+ display: inline-block;
+ padding: 0 6px;
+ line-height: 32px;
+ color: #8285f5;
+ cursor: pointer;
+ font-size: 14px;
+ user-select: none;
+ & i {
+ font-size: 20px;
+ }
+ &:hover {
+ color: #4348d4;
+ }
+ }
+ .bar-btn + .bar-btn {
+ margin-left: 8px;
+ }
+ .delete-btn {
+ color: #f56c6c;
+ &:hover {
+ color: #ea0b30;
+ }
+ }
+ }
+}
diff --git a/acs/nladmin-ui/src/views/system/build/generator/config.js b/acs/nladmin-ui/src/views/system/build/generator/config.js
new file mode 100644
index 0000000..780a1bb
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/generator/config.js
@@ -0,0 +1,630 @@
+// 表单属性【右面板】
+export const formConf = {
+ formRef: 'elForm',
+ formModel: 'formData',
+ size: 'medium',
+ labelPosition: 'right',
+ labelWidth: 100,
+ formRules: 'rules',
+ gutter: 15,
+ disabled: false,
+ span: 24,
+ formBtns: true
+}
+
+// 输入型组件 【左面板】
+export const inputComponents = [
+ {
+ // 组件的自定义配置
+ __config__: {
+ label: '单行文本',
+ labelWidth: null,
+ showLabel: true,
+ changeTag: true,
+ tag: 'el-input',
+ tagIcon: 'input',
+ defaultValue: undefined,
+ required: true,
+ layout: 'colFormItem',
+ span: 24,
+ document: 'https://element.eleme.cn/#/zh-CN/component/input',
+ // 正则校验规则
+ regList: []
+ },
+ // 组件的插槽属性
+ __slot__: {
+ prepend: '',
+ append: ''
+ },
+ // 其余的为可直接写在组件标签上的属性
+ placeholder: '请输入',
+ style: { width: '100%' },
+ clearable: true,
+ 'prefix-icon': '',
+ 'suffix-icon': '',
+ maxlength: null,
+ 'show-word-limit': false,
+ readonly: false,
+ disabled: false
+ },
+ {
+ __config__: {
+ label: '多行文本',
+ labelWidth: null,
+ showLabel: true,
+ tag: 'el-input',
+ tagIcon: 'textarea',
+ defaultValue: undefined,
+ required: true,
+ layout: 'colFormItem',
+ span: 24,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/input'
+ },
+ type: 'textarea',
+ placeholder: '请输入',
+ autosize: {
+ minRows: 4,
+ maxRows: 4
+ },
+ style: { width: '100%' },
+ maxlength: null,
+ 'show-word-limit': false,
+ readonly: false,
+ disabled: false
+ },
+ {
+ __config__: {
+ label: '密码',
+ showLabel: true,
+ labelWidth: null,
+ changeTag: true,
+ tag: 'el-input',
+ tagIcon: 'password',
+ defaultValue: undefined,
+ layout: 'colFormItem',
+ span: 24,
+ required: true,
+ regList: [],
+ document: 'https://element.eleme.cn/#/zh-CN/component/input'
+ },
+ __slot__: {
+ prepend: '',
+ append: ''
+ },
+ placeholder: '请输入',
+ 'show-password': true,
+ style: { width: '100%' },
+ clearable: true,
+ 'prefix-icon': '',
+ 'suffix-icon': '',
+ maxlength: null,
+ 'show-word-limit': false,
+ readonly: false,
+ disabled: false
+ },
+ {
+ __config__: {
+ label: '计数器',
+ showLabel: true,
+ changeTag: true,
+ labelWidth: null,
+ tag: 'el-input-number',
+ tagIcon: 'number',
+ defaultValue: undefined,
+ span: 24,
+ layout: 'colFormItem',
+ required: true,
+ regList: [],
+ document: 'https://element.eleme.cn/#/zh-CN/component/input-number'
+ },
+ placeholder: '',
+ min: undefined,
+ max: undefined,
+ step: 1,
+ 'step-strictly': false,
+ precision: undefined,
+ 'controls-position': '',
+ disabled: false
+ },
+ {
+ __config__: {
+ label: '编辑器',
+ showLabel: true,
+ changeTag: true,
+ labelWidth: null,
+ tag: 'tinymce',
+ tagIcon: 'rich-text',
+ defaultValue: null,
+ span: 24,
+ layout: 'colFormItem',
+ required: true,
+ regList: [],
+ document: 'http://tinymce.ax-z.cn'
+ },
+ placeholder: '请输入',
+ height: 300, // 编辑器高度
+ branding: false // 隐藏右下角品牌烙印
+ }
+]
+
+// 选择型组件 【左面板】
+export const selectComponents = [
+ {
+ __config__: {
+ label: '下拉选择',
+ showLabel: true,
+ labelWidth: null,
+ tag: 'el-select',
+ tagIcon: 'select',
+ layout: 'colFormItem',
+ span: 24,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/select'
+ },
+ __slot__: {
+ options: [{
+ label: '选项一',
+ value: 1
+ }, {
+ label: '选项二',
+ value: 2
+ }]
+ },
+ placeholder: '请选择',
+ style: { width: '100%' },
+ clearable: true,
+ disabled: false,
+ filterable: false,
+ multiple: false
+ },
+ {
+ __config__: {
+ label: '级联选择',
+ url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/cascaderList',
+ method: 'get',
+ dataPath: 'list',
+ dataConsumer: 'options',
+ showLabel: true,
+ labelWidth: null,
+ tag: 'el-cascader',
+ tagIcon: 'cascader',
+ layout: 'colFormItem',
+ defaultValue: [],
+ dataType: 'dynamic',
+ span: 24,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/cascader'
+ },
+ options: [{
+ id: 1,
+ value: 1,
+ label: '选项1',
+ children: [{
+ id: 2,
+ value: 2,
+ label: '选项1-1'
+ }]
+ }],
+ placeholder: '请选择',
+ style: { width: '100%' },
+ props: {
+ props: {
+ multiple: false,
+ label: 'label',
+ value: 'value',
+ children: 'children'
+ }
+ },
+ 'show-all-levels': true,
+ disabled: false,
+ clearable: true,
+ filterable: false,
+ separator: '/'
+ },
+ {
+ __config__: {
+ label: '单选框组',
+ labelWidth: null,
+ showLabel: true,
+ tag: 'el-radio-group',
+ tagIcon: 'radio',
+ changeTag: true,
+ defaultValue: undefined,
+ layout: 'colFormItem',
+ span: 24,
+ optionType: 'default',
+ regList: [],
+ required: true,
+ border: false,
+ document: 'https://element.eleme.cn/#/zh-CN/component/radio'
+ },
+ __slot__: {
+ options: [{
+ label: '选项一',
+ value: 1
+ }, {
+ label: '选项二',
+ value: 2
+ }]
+ },
+ style: {},
+ size: 'medium',
+ disabled: false
+ },
+ {
+ __config__: {
+ label: '多选框组',
+ tag: 'el-checkbox-group',
+ tagIcon: 'checkbox',
+ defaultValue: [],
+ span: 24,
+ showLabel: true,
+ labelWidth: null,
+ layout: 'colFormItem',
+ optionType: 'default',
+ required: true,
+ regList: [],
+ changeTag: true,
+ border: false,
+ document: 'https://element.eleme.cn/#/zh-CN/component/checkbox'
+ },
+ __slot__: {
+ options: [{
+ label: '选项一',
+ value: 1
+ }, {
+ label: '选项二',
+ value: 2
+ }]
+ },
+ style: {},
+ size: 'medium',
+ min: null,
+ max: null,
+ disabled: false
+ },
+ {
+ __config__: {
+ label: '开关',
+ tag: 'el-switch',
+ tagIcon: 'switch',
+ defaultValue: false,
+ span: 24,
+ showLabel: true,
+ labelWidth: null,
+ layout: 'colFormItem',
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/switch'
+ },
+ style: {},
+ disabled: false,
+ 'active-text': '',
+ 'inactive-text': '',
+ 'active-color': null,
+ 'inactive-color': null,
+ 'active-value': true,
+ 'inactive-value': false
+ },
+ {
+ __config__: {
+ label: '滑块',
+ tag: 'el-slider',
+ tagIcon: 'slider',
+ defaultValue: null,
+ span: 24,
+ showLabel: true,
+ layout: 'colFormItem',
+ labelWidth: null,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/slider'
+ },
+ disabled: false,
+ min: 0,
+ max: 100,
+ step: 1,
+ 'show-stops': false,
+ range: false
+ },
+ {
+ __config__: {
+ label: '时间选择',
+ tag: 'el-time-picker',
+ tagIcon: 'time',
+ defaultValue: null,
+ span: 24,
+ showLabel: true,
+ layout: 'colFormItem',
+ labelWidth: null,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/time-picker'
+ },
+ placeholder: '请选择',
+ style: { width: '100%' },
+ disabled: false,
+ clearable: true,
+ 'picker-options': {
+ selectableRange: '00:00:00-23:59:59'
+ },
+ format: 'HH:mm:ss',
+ 'value-format': 'HH:mm:ss'
+ },
+ {
+ __config__: {
+ label: '时间范围',
+ tag: 'el-time-picker',
+ tagIcon: 'time-range',
+ span: 24,
+ showLabel: true,
+ labelWidth: null,
+ layout: 'colFormItem',
+ defaultValue: null,
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/time-picker'
+ },
+ style: { width: '100%' },
+ disabled: false,
+ clearable: true,
+ 'is-range': true,
+ 'range-separator': '至',
+ 'start-placeholder': '开始时间',
+ 'end-placeholder': '结束时间',
+ format: 'HH:mm:ss',
+ 'value-format': 'HH:mm:ss'
+ },
+ {
+ __config__: {
+ label: '日期选择',
+ tag: 'el-date-picker',
+ tagIcon: 'date',
+ defaultValue: null,
+ showLabel: true,
+ labelWidth: null,
+ span: 24,
+ layout: 'colFormItem',
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/date-picker'
+ },
+ placeholder: '请选择',
+ type: 'date',
+ style: { width: '100%' },
+ disabled: false,
+ clearable: true,
+ format: 'yyyy-MM-dd',
+ 'value-format': 'yyyy-MM-dd',
+ readonly: false
+ },
+ {
+ __config__: {
+ label: '日期范围',
+ tag: 'el-date-picker',
+ tagIcon: 'date-range',
+ defaultValue: null,
+ span: 24,
+ showLabel: true,
+ labelWidth: null,
+ required: true,
+ layout: 'colFormItem',
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/date-picker'
+ },
+ style: { width: '100%' },
+ type: 'daterange',
+ 'range-separator': '至',
+ 'start-placeholder': '开始日期',
+ 'end-placeholder': '结束日期',
+ disabled: false,
+ clearable: true,
+ format: 'yyyy-MM-dd',
+ 'value-format': 'yyyy-MM-dd',
+ readonly: false
+ },
+ {
+ __config__: {
+ label: '评分',
+ tag: 'el-rate',
+ tagIcon: 'rate',
+ defaultValue: 0,
+ span: 24,
+ showLabel: true,
+ labelWidth: null,
+ layout: 'colFormItem',
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/rate'
+ },
+ style: {},
+ max: 5,
+ 'allow-half': false,
+ 'show-text': false,
+ 'show-score': false,
+ disabled: false
+ },
+ {
+ __config__: {
+ label: '颜色选择',
+ tag: 'el-color-picker',
+ tagIcon: 'color',
+ span: 24,
+ defaultValue: null,
+ showLabel: true,
+ labelWidth: null,
+ layout: 'colFormItem',
+ required: true,
+ regList: [],
+ changeTag: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/color-picker'
+ },
+ 'show-alpha': false,
+ 'color-format': '',
+ disabled: false,
+ size: 'medium'
+ },
+ {
+ __config__: {
+ label: '上传',
+ tag: 'el-upload',
+ tagIcon: 'upload',
+ layout: 'colFormItem',
+ defaultValue: null,
+ showLabel: true,
+ labelWidth: null,
+ required: true,
+ span: 24,
+ showTip: false,
+ buttonText: '点击上传',
+ regList: [],
+ changeTag: true,
+ fileSize: 2,
+ sizeUnit: 'MB',
+ document: 'https://element.eleme.cn/#/zh-CN/component/upload'
+ },
+ __slot__: {
+ 'list-type': true
+ },
+ // action: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址
+ action: '/infra/file/upload', // 请求地址
+ disabled: false,
+ accept: '',
+ name: 'file',
+ 'auto-upload': true,
+ 'list-type': 'text',
+ multiple: false
+ }
+]
+
+// 布局型组件 【左面板】
+export const layoutComponents = [
+ {
+ __config__: {
+ layout: 'rowFormItem',
+ tagIcon: 'row',
+ label: '行容器',
+ layoutTree: true,
+ document: 'https://element.eleme.cn/#/zh-CN/component/layout#row-attributes'
+ },
+ type: 'default',
+ justify: 'start',
+ align: 'top'
+ },
+ {
+ __config__: {
+ label: '按钮',
+ showLabel: true,
+ changeTag: true,
+ labelWidth: null,
+ tag: 'el-button',
+ tagIcon: 'button',
+ span: 24,
+ layout: 'colFormItem',
+ document: 'https://element.eleme.cn/#/zh-CN/component/button'
+ },
+ __slot__: {
+ default: '主要按钮'
+ },
+ type: 'primary',
+ icon: 'el-icon-search',
+ round: false,
+ size: 'medium',
+ plain: false,
+ circle: false,
+ disabled: false
+ },
+ {
+ __config__: {
+ layout: 'colFormItem',
+ tagIcon: 'table',
+ tag: 'el-table',
+ document: 'https://element.eleme.cn/#/zh-CN/component/table',
+ span: 24,
+ formId: 101,
+ renderKey: 1595761764203,
+ componentName: 'row101',
+ showLabel: true,
+ changeTag: true,
+ labelWidth: null,
+ label: '表格[开发中]',
+ dataType: 'dynamic',
+ method: 'get',
+ dataPath: 'list',
+ dataConsumer: 'data',
+ url: 'https://www.fastmock.site/mock/f8d7a54fb1e60561e2f720d5a810009d/fg/tableData',
+ children: [{
+ __config__: {
+ layout: 'raw',
+ tag: 'el-table-column',
+ renderKey: 15957617660153
+ },
+ prop: 'date',
+ label: '日期'
+ }, {
+ __config__: {
+ layout: 'raw',
+ tag: 'el-table-column',
+ renderKey: 15957617660152
+ },
+ prop: 'address',
+ label: '地址'
+ }, {
+ __config__: {
+ layout: 'raw',
+ tag: 'el-table-column',
+ renderKey: 15957617660151
+ },
+ prop: 'name',
+ label: '名称'
+ }, {
+ __config__: {
+ layout: 'raw',
+ tag: 'el-table-column',
+ renderKey: 1595774496335,
+ children: [
+ {
+ __config__: {
+ label: '按钮',
+ tag: 'el-button',
+ tagIcon: 'button',
+ layout: 'raw',
+ renderKey: 1595779809901
+ },
+ __slot__: {
+ default: '主要按钮'
+ },
+ type: 'primary',
+ icon: 'el-icon-search',
+ round: false,
+ size: 'medium'
+ }
+ ]
+ },
+ label: '操作'
+ }]
+ },
+ data: [],
+ directives: [{
+ name: 'loading',
+ value: true
+ }],
+ border: true,
+ type: 'default',
+ justify: 'start',
+ align: 'top'
+ }
+]
diff --git a/acs/nladmin-ui/src/views/system/build/generator/css.js b/acs/nladmin-ui/src/views/system/build/generator/css.js
new file mode 100644
index 0000000..7cb86e6
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/generator/css.js
@@ -0,0 +1,18 @@
+const styles = {
+ 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}',
+ 'el-upload': '.el-upload__tip{line-height: 1.2;}'
+}
+
+function addCss(cssList, el) {
+ const css = styles[el.__config__.tag]
+ css && cssList.indexOf(css) === -1 && cssList.push(css)
+ if (el.__config__.children) {
+ el.__config__.children.forEach(el2 => addCss(cssList, el2))
+ }
+}
+
+export function makeUpCss(conf) {
+ const cssList = []
+ conf.fields.forEach(el => addCss(cssList, el))
+ return cssList.join('\n')
+}
diff --git a/acs/nladmin-ui/src/views/system/build/generator/drawingDefalut.js b/acs/nladmin-ui/src/views/system/build/generator/drawingDefalut.js
new file mode 100644
index 0000000..dbc1daf
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/generator/drawingDefalut.js
@@ -0,0 +1,37 @@
+export default [
+ {
+ __config__: {
+ label: '单行文本',
+ labelWidth: null,
+ showLabel: true,
+ changeTag: true,
+ tag: 'el-input',
+ tagIcon: 'input',
+ defaultValue: undefined,
+ required: true,
+ layout: 'colFormItem',
+ span: 24,
+ document: 'https://element.eleme.cn/#/zh-CN/component/input',
+ // 正则校验规则
+ regList: [{
+ pattern: '/^1(3|4|5|7|8|9)\\d{9}$/',
+ message: '手机号格式错误'
+ }]
+ },
+ // 组件的插槽属性
+ __slot__: {
+ prepend: '',
+ append: ''
+ },
+ __vModel__: 'mobile',
+ placeholder: '请输入手机号',
+ style: { width: '100%' },
+ clearable: true,
+ 'prefix-icon': 'el-icon-mobile',
+ 'suffix-icon': '',
+ maxlength: 11,
+ 'show-word-limit': true,
+ readonly: false,
+ disabled: false
+ }
+]
diff --git a/acs/nladmin-ui/src/views/system/build/generator/html.js b/acs/nladmin-ui/src/views/system/build/generator/html.js
new file mode 100644
index 0000000..6e9a32e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/generator/html.js
@@ -0,0 +1,399 @@
+/* eslint-disable max-len */
+import ruleTrigger from './ruleTrigger'
+
+let confGlobal
+let someSpanIsNot24
+
+export function dialogWrapper(str) {
+ return `
+ ${str}
+
+ 取消
+ 确定
+
+ `
+}
+
+export function vueTemplate(str) {
+ return `
+
+ ${str}
+
+ `
+}
+
+export function vueScript(str) {
+ return ``
+}
+
+export function cssStyle(cssStr) {
+ return ``
+}
+
+function buildFormTemplate(scheme, child, type) {
+ let labelPosition = ''
+ if (scheme.labelPosition !== 'right') {
+ labelPosition = `label-position="${scheme.labelPosition}"`
+ }
+ const disabled = scheme.disabled ? `:disabled="${scheme.disabled}"` : ''
+ let str = `
+ ${child}
+ ${buildFromBtns(scheme, type)}
+ `
+ if (someSpanIsNot24) {
+ str = `
+ ${str}
+ `
+ }
+ return str
+}
+
+function buildFromBtns(scheme, type) {
+ let str = ''
+ if (scheme.formBtns && type === 'file') {
+ str = `
+ 提交
+ 重置
+ `
+ if (someSpanIsNot24) {
+ str = `
+ ${str}
+ `
+ }
+ }
+ return str
+}
+
+// span不为24的用el-col包裹
+function colWrapper(scheme, str) {
+ if (someSpanIsNot24 || scheme.__config__.span !== 24) {
+ return `
+ ${str}
+ `
+ }
+ return str
+}
+
+const layouts = {
+ colFormItem(scheme) {
+ const config = scheme.__config__
+ let labelWidth = ''
+ let label = `label="${config.label}"`
+ if (config.labelWidth && config.labelWidth !== confGlobal.labelWidth) {
+ labelWidth = `label-width="${config.labelWidth}px"`
+ }
+ if (config.showLabel === false) {
+ labelWidth = 'label-width="0"'
+ label = ''
+ }
+ const required = !ruleTrigger[config.tag] && config.required ? 'required' : ''
+ const tagDom = tags[config.tag] ? tags[config.tag](scheme) : null
+ let str = `
+ ${tagDom}
+ `
+ str = colWrapper(scheme, str)
+ return str
+ },
+ rowFormItem(scheme) {
+ const config = scheme.__config__
+ const type = scheme.type === 'default' ? '' : `type="${scheme.type}"`
+ const justify = scheme.type === 'default' ? '' : `justify="${scheme.justify}"`
+ const align = scheme.type === 'default' ? '' : `align="${scheme.align}"`
+ const gutter = scheme.gutter ? `:gutter="${scheme.gutter}"` : ''
+ const children = config.children.map(el => layouts[el.__config__.layout](el))
+ let str = `
+ ${children.join('\n')}
+ `
+ str = colWrapper(scheme, str)
+ return str
+ }
+}
+
+const tags = {
+ 'el-button': el => {
+ const {
+ tag, disabled
+ } = attrBuilder(el)
+ const type = el.type ? `type="${el.type}"` : ''
+ const icon = el.icon ? `icon="${el.icon}"` : ''
+ const round = el.round ? 'round' : ''
+ const size = el.size ? `size="${el.size}"` : ''
+ const plain = el.plain ? 'plain' : ''
+ const circle = el.circle ? 'circle' : ''
+ let child = buildElButtonChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${tag} ${type} ${icon} ${round} ${size} ${plain} ${disabled} ${circle}>${child}${tag}>`
+ },
+ 'el-input': el => {
+ const {
+ tag, disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : ''
+ const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : ''
+ const readonly = el.readonly ? 'readonly' : ''
+ const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : ''
+ const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : ''
+ const showPassword = el['show-password'] ? 'show-password' : ''
+ const type = el.type ? `type="${el.type}"` : ''
+ const autosize = el.autosize && el.autosize.minRows
+ ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"`
+ : ''
+ let child = buildElInputChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}${tag}>`
+ },
+ 'el-input-number': el => {
+ const {
+ tag, disabled, vModel, placeholder
+ } = attrBuilder(el)
+ const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : ''
+ const min = el.min ? `:min='${el.min}'` : ''
+ const max = el.max ? `:max='${el.max}'` : ''
+ const step = el.step ? `:step='${el.step}'` : ''
+ const stepStrictly = el['step-strictly'] ? 'step-strictly' : ''
+ const precision = el.precision ? `:precision='${el.precision}'` : ''
+
+ return `<${tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}>${tag}>`
+ },
+ 'el-select': el => {
+ const {
+ tag, disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const filterable = el.filterable ? 'filterable' : ''
+ const multiple = el.multiple ? 'multiple' : ''
+ let child = buildElSelectChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}${tag}>`
+ },
+ 'el-radio-group': el => {
+ const { tag, disabled, vModel } = attrBuilder(el)
+ const size = `size="${el.size}"`
+ let child = buildElRadioGroupChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${tag} ${vModel} ${size} ${disabled}>${child}${tag}>`
+ },
+ 'el-checkbox-group': el => {
+ const { tag, disabled, vModel } = attrBuilder(el)
+ const size = `size="${el.size}"`
+ const min = el.min ? `:min="${el.min}"` : ''
+ const max = el.max ? `:max="${el.max}"` : ''
+ let child = buildElCheckboxGroupChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}${tag}>`
+ },
+ 'el-switch': el => {
+ const { tag, disabled, vModel } = attrBuilder(el)
+ const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : ''
+ const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : ''
+ const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : ''
+ const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : ''
+ const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : ''
+ const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : ''
+
+ return `<${tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}>${tag}>`
+ },
+ 'el-cascader': el => {
+ const {
+ tag, disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const options = el.options ? `:options="${el.__vModel__}Options"` : ''
+ const props = el.props ? `:props="${el.__vModel__}Props"` : ''
+ const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"'
+ const filterable = el.filterable ? 'filterable' : ''
+ const separator = el.separator === '/' ? '' : `separator="${el.separator}"`
+
+ return `<${tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}>${tag}>`
+ },
+ 'el-slider': el => {
+ const { tag, disabled, vModel } = attrBuilder(el)
+ const min = el.min ? `:min='${el.min}'` : ''
+ const max = el.max ? `:max='${el.max}'` : ''
+ const step = el.step ? `:step='${el.step}'` : ''
+ const range = el.range ? 'range' : ''
+ const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : ''
+
+ return `<${tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}>${tag}>`
+ },
+ 'el-time-picker': el => {
+ const {
+ tag, disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
+ const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
+ const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
+ const isRange = el['is-range'] ? 'is-range' : ''
+ const format = el.format ? `format="${el.format}"` : ''
+ const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
+ const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : ''
+
+ return `<${tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}>${tag}>`
+ },
+ 'el-date-picker': el => {
+ const {
+ tag, disabled, vModel, clearable, placeholder, width
+ } = attrBuilder(el)
+ const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : ''
+ const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : ''
+ const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : ''
+ const format = el.format ? `format="${el.format}"` : ''
+ const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : ''
+ const type = el.type === 'date' ? '' : `type="${el.type}"`
+ const readonly = el.readonly ? 'readonly' : ''
+
+ return `<${tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}>${tag}>`
+ },
+ 'el-rate': el => {
+ const { tag, disabled, vModel } = attrBuilder(el)
+ const max = el.max ? `:max='${el.max}'` : ''
+ const allowHalf = el['allow-half'] ? 'allow-half' : ''
+ const showText = el['show-text'] ? 'show-text' : ''
+ const showScore = el['show-score'] ? 'show-score' : ''
+
+ return `<${tag} ${vModel} ${max} ${allowHalf} ${showText} ${showScore} ${disabled}>${tag}>`
+ },
+ 'el-color-picker': el => {
+ const { tag, disabled, vModel } = attrBuilder(el)
+ const size = `size="${el.size}"`
+ const showAlpha = el['show-alpha'] ? 'show-alpha' : ''
+ const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : ''
+
+ return `<${tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}>${tag}>`
+ },
+ 'el-upload': el => {
+ const { tag } = el.__config__
+ const disabled = el.disabled ? ':disabled=\'true\'' : ''
+ const action = el.action ? `:action="${el.__vModel__}Action"` : ''
+ const multiple = el.multiple ? 'multiple' : ''
+ const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : ''
+ const accept = el.accept ? `accept="${el.accept}"` : ''
+ const name = el.name !== 'file' ? `name="${el.name}"` : ''
+ const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : ''
+ const beforeUpload = `:before-upload="${el.__vModel__}BeforeUpload"`
+ const fileList = `:file-list="${el.__vModel__}fileList"`
+ const ref = `ref="${el.__vModel__}"`
+ let child = buildElUploadChild(el)
+
+ if (child) child = `\n${child}\n` // 换行
+ return `<${tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}${tag}>`
+ },
+ tinymce: el => {
+ const { tag, vModel, placeholder } = attrBuilder(el)
+ const height = el.height ? `:height="${el.height}"` : ''
+ const branding = el.branding ? `:branding="${el.branding}"` : ''
+ return `<${tag} ${vModel} ${placeholder} ${height} ${branding}>${tag}>`
+ }
+}
+
+function attrBuilder(el) {
+ return {
+ tag: el.__config__.tag,
+ vModel: `v-model="${confGlobal.formModel}.${el.__vModel__}"`,
+ clearable: el.clearable ? 'clearable' : '',
+ placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '',
+ width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '',
+ disabled: el.disabled ? ':disabled=\'true\'' : ''
+ }
+}
+
+// el-buttin 子级
+function buildElButtonChild(scheme) {
+ const children = []
+ const slot = scheme.__slot__ || {}
+ if (slot.default) {
+ children.push(slot.default)
+ }
+ return children.join('\n')
+}
+
+// el-input 子级
+function buildElInputChild(scheme) {
+ const children = []
+ const slot = scheme.__slot__
+ if (slot && slot.prepend) {
+ children.push(`${slot.prepend}`)
+ }
+ if (slot && slot.append) {
+ children.push(`${slot.append}`)
+ }
+ return children.join('\n')
+}
+
+// el-select 子级
+function buildElSelectChild(scheme) {
+ const children = []
+ const slot = scheme.__slot__
+ if (slot && slot.options && slot.options.length) {
+ children.push(``)
+ }
+ return children.join('\n')
+}
+
+// el-radio-group 子级
+function buildElRadioGroupChild(scheme) {
+ const children = []
+ const slot = scheme.__slot__
+ const config = scheme.__config__
+ if (slot && slot.options && slot.options.length) {
+ const tag = config.optionType === 'button' ? 'el-radio-button' : 'el-radio'
+ const border = config.border ? 'border' : ''
+ children.push(`<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}${tag}>`)
+ }
+ return children.join('\n')
+}
+
+// el-checkbox-group 子级
+function buildElCheckboxGroupChild(scheme) {
+ const children = []
+ const slot = scheme.__slot__
+ const config = scheme.__config__
+ if (slot && slot.options && slot.options.length) {
+ const tag = config.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox'
+ const border = config.border ? 'border' : ''
+ children.push(`<${tag} v-for="(item, index) in ${scheme.__vModel__}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}${tag}>`)
+ }
+ return children.join('\n')
+}
+
+// el-upload 子级
+function buildElUploadChild(scheme) {
+ const list = []
+ const config = scheme.__config__
+ if (scheme['list-type'] === 'picture-card') list.push('')
+ else list.push(`${config.buttonText}`)
+ if (config.showTip) list.push(`只能上传不超过 ${config.fileSize}${config.sizeUnit} 的${scheme.accept}文件
`)
+ return list.join('\n')
+}
+
+/**
+ * 组装html代码。【入口函数】
+ * @param {Object} formConfig 整个表单配置
+ * @param {String} type 生成类型,文件或弹窗等
+ */
+export function makeUpHtml(formConfig, type) {
+ const htmlList = []
+ confGlobal = formConfig
+ // 判断布局是否都沾满了24个栅格,以备后续简化代码结构
+ someSpanIsNot24 = formConfig.fields.some(item => item.__config__.span !== 24)
+ // 遍历渲染每个组件成html
+ formConfig.fields.forEach(el => {
+ htmlList.push(layouts[el.__config__.layout](el))
+ })
+ const htmlStr = htmlList.join('\n')
+ // 将组件代码放进form标签
+ let temp = buildFormTemplate(formConfig, htmlStr, type)
+ // dialog标签包裹代码
+ if (type === 'dialog') {
+ temp = dialogWrapper(temp)
+ }
+ confGlobal = null
+ return temp
+}
diff --git a/acs/nladmin-ui/src/views/system/build/generator/js.js b/acs/nladmin-ui/src/views/system/build/generator/js.js
new file mode 100644
index 0000000..0e0978b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/generator/js.js
@@ -0,0 +1,271 @@
+import { isArray } from 'util'
+import { exportDefault, titleCase, deepClone } from '../utils/index'
+import ruleTrigger from './ruleTrigger'
+
+const units = {
+ KB: '1024',
+ MB: '1024 / 1024',
+ GB: '1024 / 1024 / 1024'
+}
+let confGlobal
+const inheritAttrs = {
+ file: '',
+ dialog: 'inheritAttrs: false,'
+}
+
+/**
+ * 组装js 【入口函数】
+ * @param {Object} formConfig 整个表单配置
+ * @param {String} type 生成类型,文件或弹窗等
+ */
+export function makeUpJs(formConfig, type) {
+ confGlobal = formConfig = deepClone(formConfig)
+ const dataList = []
+ const ruleList = []
+ const optionsList = []
+ const propsList = []
+ const methodList = mixinMethod(type)
+ const uploadVarList = []
+ const created = []
+
+ formConfig.fields.forEach(el => {
+ buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created)
+ })
+
+ const script = buildexport(
+ formConfig,
+ type,
+ dataList.join('\n'),
+ ruleList.join('\n'),
+ optionsList.join('\n'),
+ uploadVarList.join('\n'),
+ propsList.join('\n'),
+ methodList.join('\n'),
+ created.join('\n')
+ )
+ confGlobal = null
+ return script
+}
+
+// 构建组件属性
+function buildAttributes(scheme, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created) {
+ const config = scheme.__config__
+ const slot = scheme.__slot__
+ buildData(scheme, dataList)
+ buildRules(scheme, ruleList)
+
+ // 特殊处理options属性
+ if (scheme.options || (slot && slot.options && slot.options.length)) {
+ buildOptions(scheme, optionsList)
+ if (config.dataType === 'dynamic') {
+ const model = `${scheme.__vModel__}Options`
+ const options = titleCase(model)
+ const methodName = `get${options}`
+ buildOptionMethod(methodName, model, methodList, scheme)
+ callInCreated(methodName, created)
+ }
+ }
+
+ // 处理props
+ if (scheme.props && scheme.props.props) {
+ buildProps(scheme, propsList)
+ }
+
+ // 处理el-upload的action
+ if (scheme.action && config.tag === 'el-upload') {
+ uploadVarList.push(
+ `${scheme.__vModel__}Action: '${scheme.action}',
+ ${scheme.__vModel__}fileList: [],`
+ )
+ methodList.push(buildBeforeUpload(scheme))
+ // 非自动上传时,生成手动上传的函数
+ if (!scheme['auto-upload']) {
+ methodList.push(buildSubmitUpload(scheme))
+ }
+ }
+
+ // 构建子级组件属性
+ if (config.children) {
+ config.children.forEach(item => {
+ buildAttributes(item, dataList, ruleList, optionsList, methodList, propsList, uploadVarList, created)
+ })
+ }
+}
+
+// 在Created调用函数
+function callInCreated(methodName, created) {
+ created.push(`this.${methodName}()`)
+}
+
+// 混入处理函数
+function mixinMethod(type) {
+ const list = []; const
+ minxins = {
+ file: confGlobal.formBtns ? {
+ submitForm: `submitForm() {
+ this.$refs['${confGlobal.formRef}'].validate(valid => {
+ if(!valid) return
+ // TODO 提交表单
+ })
+ },`,
+ resetForm: `resetForm() {
+ this.$refs['${confGlobal.formRef}'].resetFields()
+ },`
+ } : null,
+ dialog: {
+ onOpen: 'onOpen() {},',
+ onClose: `onClose() {
+ this.$refs['${confGlobal.formRef}'].resetFields()
+ },`,
+ close: `close() {
+ this.$emit('update:visible', false)
+ },`,
+ handelConfirm: `handelConfirm() {
+ this.$refs['${confGlobal.formRef}'].validate(valid => {
+ if(!valid) return
+ this.close()
+ })
+ },`
+ }
+ }
+
+ const methods = minxins[type]
+ if (methods) {
+ Object.keys(methods).forEach(key => {
+ list.push(methods[key])
+ })
+ }
+
+ return list
+}
+
+// 构建data
+function buildData(scheme, dataList) {
+ const config = scheme.__config__
+ if (scheme.__vModel__ === undefined) return
+ const defaultValue = JSON.stringify(config.defaultValue)
+ dataList.push(`${scheme.__vModel__}: ${defaultValue},`)
+}
+
+// 构建校验规则
+function buildRules(scheme, ruleList) {
+ const config = scheme.__config__
+ if (scheme.__vModel__ === undefined) return
+ const rules = []
+ if (ruleTrigger[config.tag]) {
+ if (config.required) {
+ const type = isArray(config.defaultValue) ? 'type: \'array\',' : ''
+ let message = isArray(config.defaultValue) ? `请至少选择一个${config.label}` : scheme.placeholder
+ if (message === undefined) message = `${config.label}不能为空`
+ rules.push(`{ required: true, ${type} message: '${message}', trigger: '${ruleTrigger[config.tag]}' }`)
+ }
+ if (config.regList && isArray(config.regList)) {
+ config.regList.forEach(item => {
+ if (item.pattern) {
+ rules.push(
+ `{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${ruleTrigger[config.tag]}' }`
+ )
+ }
+ })
+ }
+ ruleList.push(`${scheme.__vModel__}: [${rules.join(',')}],`)
+ }
+}
+
+// 构建options
+function buildOptions(scheme, optionsList) {
+ if (scheme.__vModel__ === undefined) return
+ // el-cascader直接有options属性,其他组件都是定义在slot中,所以有两处判断
+ let { options } = scheme
+ if (!options) options = scheme.__slot__.options
+ if (scheme.__config__.dataType === 'dynamic') { options = [] }
+ const str = `${scheme.__vModel__}Options: ${JSON.stringify(options)},`
+ optionsList.push(str)
+}
+
+function buildProps(scheme, propsList) {
+ const str = `${scheme.__vModel__}Props: ${JSON.stringify(scheme.props.props)},`
+ propsList.push(str)
+}
+
+// el-upload的BeforeUpload
+function buildBeforeUpload(scheme) {
+ const config = scheme.__config__
+ const unitNum = units[config.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const
+ returnList = []
+ if (config.fileSize) {
+ rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${config.fileSize}
+ if(!isRightSize){
+ this.$message.error('文件大小超过 ${config.fileSize}${config.sizeUnit}')
+ }`
+ returnList.push('isRightSize')
+ }
+ if (scheme.accept) {
+ acceptCode = `let isAccept = new RegExp('${scheme.accept}').test(file.type)
+ if(!isAccept){
+ this.$message.error('应该选择${scheme.accept}类型的文件')
+ }`
+ returnList.push('isAccept')
+ }
+ const str = `${scheme.__vModel__}BeforeUpload(file) {
+ ${rightSizeCode}
+ ${acceptCode}
+ return ${returnList.join('&&')}
+ },`
+ return returnList.length ? str : ''
+}
+
+// el-upload的submit
+function buildSubmitUpload(scheme) {
+ const str = `submitUpload() {
+ this.$refs['${scheme.__vModel__}'].submit()
+ },`
+ return str
+}
+
+function buildOptionMethod(methodName, model, methodList, scheme) {
+ const config = scheme.__config__
+ const str = `${methodName}() {
+ // 注意:this.$axios是通过Vue.prototype.$axios = axios挂载产生的
+ this.$axios({
+ method: '${config.method}',
+ url: '${config.url}'
+ }).then(resp => {
+ var { data } = resp
+ this.${model} = data.${config.dataPath}
+ })
+ },`
+ methodList.push(str)
+}
+
+// js整体拼接
+function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods, created) {
+ const str = `${exportDefault}{
+ ${inheritAttrs[type]}
+ components: {},
+ props: [],
+ data () {
+ return {
+ ${conf.formModel}: {
+ ${data}
+ },
+ ${conf.formRules}: {
+ ${rules}
+ },
+ ${uploadVar}
+ ${selectOptions}
+ ${props}
+ }
+ },
+ computed: {},
+ watch: {},
+ created () {
+ ${created}
+ },
+ mounted () {},
+ methods: {
+ ${methods}
+ }
+}`
+ return str
+}
diff --git a/acs/nladmin-ui/src/views/system/build/generator/ruleTrigger.js b/acs/nladmin-ui/src/views/system/build/generator/ruleTrigger.js
new file mode 100644
index 0000000..3c161b5
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/generator/ruleTrigger.js
@@ -0,0 +1,16 @@
+/**
+ * 用于生成表单校验,指定正则规则的触发方式。
+ * 未在此处声明无触发方式的组件将不生成rule!!
+ */
+export default {
+ 'el-input': 'blur',
+ 'el-input-number': 'blur',
+ 'el-select': 'change',
+ 'el-radio-group': 'change',
+ 'el-checkbox-group': 'change',
+ 'el-cascader': 'change',
+ 'el-time-picker': 'change',
+ 'el-date-picker': 'change',
+ 'el-rate': 'change',
+ tinymce: 'blur'
+}
diff --git a/acs/nladmin-ui/src/views/system/build/index.vue b/acs/nladmin-ui/src/views/system/build/index.vue
new file mode 100644
index 0000000..cab915e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/index.vue
@@ -0,0 +1,860 @@
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+ {{ element.__config__.label }}
+
+
+
+
+
+
+
+
+
+
+ 查看json
+
+
+ 导出vue文件
+
+
+ 复制代码
+
+
+ 清空
+
+
+
+
+
+
+
+
+
+ 从左侧拖入或点选组件进行表单设计
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/render/render.js b/acs/nladmin-ui/src/views/system/build/render/render.js
new file mode 100644
index 0000000..7f94a50
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/render/render.js
@@ -0,0 +1,121 @@
+import { deepClone } from '../utils/index'
+const componentChild = {}
+/**
+ * 将./slots中的文件挂载到对象componentChild上
+ * 文件名为key,对应JSON配置中的__config__.tag
+ * 文件内容为value,解析JSON配置中的__slot__
+ */
+const slotsFiles = require.context('./slots', false, /\.js$/)
+const keys = slotsFiles.keys() || []
+keys.forEach(key => {
+ const tag = key.replace(/^\.\/(.*)\.\w+$/, '$1')
+ const value = slotsFiles(key).default
+ componentChild[tag] = value
+})
+
+function vModel(dataObject, defaultValue) {
+ dataObject.props.value = defaultValue
+
+ dataObject.on.input = val => {
+ this.$emit('input', val)
+ }
+}
+
+function mountSlotFiles(h, confClone, children) {
+ const childObjs = componentChild[confClone.__config__.tag]
+ if (childObjs) {
+ Object.keys(childObjs).forEach(key => {
+ const childFunc = childObjs[key]
+ if (confClone.__slot__ && confClone.__slot__[key]) {
+ children.push(childFunc(h, confClone, key))
+ }
+ })
+ }
+}
+
+function emitEvents(confClone) {
+ ['on', 'nativeOn'].forEach(attr => {
+ const eventKeyList = Object.keys(confClone[attr] || {})
+ eventKeyList.forEach(key => {
+ const val = confClone[attr][key]
+ if (typeof val === 'string') {
+ confClone[attr][key] = event => this.$emit(val, event)
+ }
+ })
+ })
+}
+
+function buildDataObject(confClone, dataObject) {
+ Object.keys(confClone).forEach(key => {
+ const val = confClone[key]
+ if (key === '__vModel__') {
+ vModel.call(this, dataObject, confClone.__config__.defaultValue)
+ } else if (dataObject[key] !== undefined) {
+ if (dataObject[key] === null ||
+ dataObject[key] instanceof RegExp ||
+ ['boolean', 'string', 'number', 'function'].includes(typeof dataObject[key])) {
+ dataObject[key] = val
+ } else if (Array.isArray(dataObject[key])) {
+ dataObject[key] = [...dataObject[key], ...val]
+ } else {
+ dataObject[key] = { ...dataObject[key], ...val }
+ }
+ } else {
+ dataObject.attrs[key] = val
+ }
+ })
+
+ // 清理属性
+ clearAttrs(dataObject)
+}
+
+function clearAttrs(dataObject) {
+ delete dataObject.attrs.__config__
+ delete dataObject.attrs.__slot__
+ delete dataObject.attrs.__methods__
+}
+
+function makeDataObject() {
+ // 深入数据对象:
+ // https://cn.vuejs.org/v2/guide/render-function.html#%E6%B7%B1%E5%85%A5%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1
+ return {
+ class: {},
+ attrs: {},
+ props: {},
+ domProps: {},
+ nativeOn: {},
+ on: {},
+ style: {},
+ directives: [],
+ scopedSlots: {},
+ slot: null,
+ key: null,
+ ref: null,
+ refInFor: true
+ }
+}
+
+export default {
+ props: {
+ conf: {
+ type: Object,
+ required: true
+ }
+ },
+ render(h) {
+ const dataObject = makeDataObject()
+ const confClone = deepClone(this.conf)
+ const children = this.$slots.default || []
+
+ // 如果slots文件夹存在与当前tag同名的文件,则执行文件中的代码
+ mountSlotFiles.call(this, h, confClone, children)
+
+ // 将字符串类型的事件,发送为消息
+ emitEvents.call(this, confClone)
+
+ // 将json表单配置转化为vue render可以识别的 “数据对象(dataObject)”
+ buildDataObject.call(this, confClone, dataObject)
+
+ return h(this.conf.__config__.tag, dataObject, children)
+ }
+}
diff --git a/acs/nladmin-ui/src/views/system/build/render/slots/el-button.js b/acs/nladmin-ui/src/views/system/build/render/slots/el-button.js
new file mode 100644
index 0000000..a2d9684
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/render/slots/el-button.js
@@ -0,0 +1,5 @@
+export default {
+ default(h, conf, key) {
+ return conf.__slot__[key]
+ }
+}
diff --git a/acs/nladmin-ui/src/views/system/build/render/slots/el-checkbox-group.js b/acs/nladmin-ui/src/views/system/build/render/slots/el-checkbox-group.js
new file mode 100644
index 0000000..0a85c8e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/render/slots/el-checkbox-group.js
@@ -0,0 +1,13 @@
+export default {
+ options(h, conf, key) {
+ const list = []
+ conf.__slot__.options.forEach(item => {
+ if (conf.__config__.optionType === 'button') {
+ list.push({item.label})
+ } else {
+ list.push({item.label})
+ }
+ })
+ return list
+ }
+}
diff --git a/acs/nladmin-ui/src/views/system/build/render/slots/el-input.js b/acs/nladmin-ui/src/views/system/build/render/slots/el-input.js
new file mode 100644
index 0000000..1545fb7
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/render/slots/el-input.js
@@ -0,0 +1,8 @@
+export default {
+ prepend(h, conf, key) {
+ return {conf.__slot__[key]}
+ },
+ append(h, conf, key) {
+ return {conf.__slot__[key]}
+ }
+}
diff --git a/acs/nladmin-ui/src/views/system/build/render/slots/el-radio-group.js b/acs/nladmin-ui/src/views/system/build/render/slots/el-radio-group.js
new file mode 100644
index 0000000..c78506f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/render/slots/el-radio-group.js
@@ -0,0 +1,13 @@
+export default {
+ options(h, conf, key) {
+ const list = []
+ conf.__slot__.options.forEach(item => {
+ if (conf.__config__.optionType === 'button') {
+ list.push({item.label})
+ } else {
+ list.push({item.label})
+ }
+ })
+ return list
+ }
+}
diff --git a/acs/nladmin-ui/src/views/system/build/render/slots/el-select.js b/acs/nladmin-ui/src/views/system/build/render/slots/el-select.js
new file mode 100644
index 0000000..cbf4a20
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/render/slots/el-select.js
@@ -0,0 +1,9 @@
+export default {
+ options(h, conf, key) {
+ const list = []
+ conf.__slot__.options.forEach(item => {
+ list.push()
+ })
+ return list
+ }
+}
diff --git a/acs/nladmin-ui/src/views/system/build/render/slots/el-upload.js b/acs/nladmin-ui/src/views/system/build/render/slots/el-upload.js
new file mode 100644
index 0000000..6af59e9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/render/slots/el-upload.js
@@ -0,0 +1,17 @@
+export default {
+ 'list-type': (h, conf, key) => {
+ const list = []
+ const config = conf.__config__
+ if (conf['list-type'] === 'picture-card') {
+ list.push()
+ } else {
+ list.push({config.buttonText})
+ }
+ if (config.showTip) {
+ list.push(
+ 只能上传不超过 {config.fileSize}{config.sizeUnit} 的{conf.accept}文件
+ )
+ }
+ return list
+ }
+}
diff --git a/acs/nladmin-ui/src/views/system/build/tinymce/README.md b/acs/nladmin-ui/src/views/system/build/tinymce/README.md
new file mode 100644
index 0000000..65c01e2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/tinymce/README.md
@@ -0,0 +1,3 @@
+## 简介
+富文本编辑器tinymce的一个vue版本封装。使用cdn动态脚本引入的方式加载。
+
diff --git a/acs/nladmin-ui/src/views/system/build/tinymce/config.js b/acs/nladmin-ui/src/views/system/build/tinymce/config.js
new file mode 100644
index 0000000..fc61554
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/tinymce/config.js
@@ -0,0 +1,8 @@
+/* eslint-disable max-len */
+
+export const plugins = [
+ 'advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount'
+]
+export const toolbar = [
+ 'code searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote removeformat subscript superscript codesample hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen'
+]
diff --git a/acs/nladmin-ui/src/views/system/build/tinymce/example/Index.vue b/acs/nladmin-ui/src/views/system/build/tinymce/example/Index.vue
new file mode 100644
index 0000000..e5a9f65
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/tinymce/example/Index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/tinymce/index.js b/acs/nladmin-ui/src/views/system/build/tinymce/index.js
new file mode 100644
index 0000000..1e83179
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/tinymce/index.js
@@ -0,0 +1,3 @@
+import Index from './index.vue'
+
+export default Index
diff --git a/acs/nladmin-ui/src/views/system/build/tinymce/index.vue b/acs/nladmin-ui/src/views/system/build/tinymce/index.vue
new file mode 100644
index 0000000..4e4be4f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/tinymce/index.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/build/tinymce/package.json b/acs/nladmin-ui/src/views/system/build/tinymce/package.json
new file mode 100644
index 0000000..3d2d2d4
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/tinymce/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "form-gen-tinymce",
+ "version": "1.0.0",
+ "description": "富文本编辑器tinymce的一个vue版本封装。使用cdn动态脚本引入的方式加载。",
+ "main": "lib/form-gen-tinymce.umd.js",
+ "directories": {
+ "example": "example"
+ },
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/JakHuang/form-generator.git"
+ },
+ "keywords": [
+ "tinymce-vue"
+ ],
+ "dependencies": {
+ "throttle-debounce": "^2.1.0"
+ },
+ "author": "jakHuang",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/JakHuang/form-generator/issues"
+ },
+ "homepage": "https://github.com/JakHuang/form-generator/blob/dev/src/components/tinymce"
+}
diff --git a/acs/nladmin-ui/src/views/system/build/tinymce/zh_CN.js b/acs/nladmin-ui/src/views/system/build/tinymce/zh_CN.js
new file mode 100644
index 0000000..4f494d6
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/tinymce/zh_CN.js
@@ -0,0 +1,420 @@
+/* eslint-disable */
+tinymce.addI18n('zh_CN',{
+"Redo": "\u91cd\u505a",
+"Undo": "\u64a4\u9500",
+"Cut": "\u526a\u5207",
+"Copy": "\u590d\u5236",
+"Paste": "\u7c98\u8d34",
+"Select all": "\u5168\u9009",
+"New document": "\u65b0\u6587\u4ef6",
+"Ok": "\u786e\u5b9a",
+"Cancel": "\u53d6\u6d88",
+"Visual aids": "\u7f51\u683c\u7ebf",
+"Bold": "\u7c97\u4f53",
+"Italic": "\u659c\u4f53",
+"Underline": "\u4e0b\u5212\u7ebf",
+"Strikethrough": "\u5220\u9664\u7ebf",
+"Superscript": "\u4e0a\u6807",
+"Subscript": "\u4e0b\u6807",
+"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
+"Align left": "\u5de6\u8fb9\u5bf9\u9f50",
+"Align center": "\u4e2d\u95f4\u5bf9\u9f50",
+"Align right": "\u53f3\u8fb9\u5bf9\u9f50",
+"Justify": "\u4e24\u7aef\u5bf9\u9f50",
+"Bullet list": "\u9879\u76ee\u7b26\u53f7",
+"Numbered list": "\u7f16\u53f7\u5217\u8868",
+"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
+"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
+"Close": "\u5173\u95ed",
+"Formats": "\u683c\u5f0f",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002",
+"Headers": "\u6807\u9898",
+"Header 1": "\u6807\u98981",
+"Header 2": "\u6807\u98982",
+"Header 3": "\u6807\u98983",
+"Header 4": "\u6807\u98984",
+"Header 5": "\u6807\u98985",
+"Header 6": "\u6807\u98986",
+"Headings": "\u6807\u9898",
+"Heading 1": "\u6807\u98981",
+"Heading 2": "\u6807\u98982",
+"Heading 3": "\u6807\u98983",
+"Heading 4": "\u6807\u98984",
+"Heading 5": "\u6807\u98985",
+"Heading 6": "\u6807\u98986",
+"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684",
+"Div": "Div",
+"Pre": "Pre",
+"Code": "\u4ee3\u7801",
+"Paragraph": "\u6bb5\u843d",
+"Blockquote": "\u5f15\u6587\u533a\u5757",
+"Inline": "\u6587\u672c",
+"Blocks": "\u57fa\u5757",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
+"Fonts": "\u5b57\u4f53",
+"Font Sizes": "\u5b57\u53f7",
+"Class": "\u7c7b\u578b",
+"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf",
+"OR": "\u6216",
+"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64",
+"Upload": "\u4e0a\u4f20",
+"Block": "\u5757",
+"Align": "\u5bf9\u9f50",
+"Default": "\u9ed8\u8ba4",
+"Circle": "\u7a7a\u5fc3\u5706",
+"Disc": "\u5b9e\u5fc3\u5706",
+"Square": "\u65b9\u5757",
+"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
+"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
+"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
+"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
+"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
+"Anchor...": "\u951a\u70b9...",
+"Name": "\u540d\u79f0",
+"Id": "\u6807\u8bc6\u7b26",
+"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
+"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
+"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
+"Special character...": "\u7279\u6b8a\u5b57\u7b26...",
+"Source code": "\u6e90\u4ee3\u7801",
+"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
+"Language": "\u8bed\u8a00",
+"Code sample...": "\u793a\u4f8b\u4ee3\u7801...",
+"Color Picker": "\u9009\u8272\u5668",
+"R": "R",
+"G": "G",
+"B": "B",
+"Left to right": "\u4ece\u5de6\u5230\u53f3",
+"Right to left": "\u4ece\u53f3\u5230\u5de6",
+"Emoticons...": "\u8868\u60c5\u7b26\u53f7...",
+"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027",
+"Title": "\u6807\u9898",
+"Keywords": "\u5173\u952e\u8bcd",
+"Description": "\u63cf\u8ff0",
+"Robots": "\u673a\u5668\u4eba",
+"Author": "\u4f5c\u8005",
+"Encoding": "\u7f16\u7801",
+"Fullscreen": "\u5168\u5c4f",
+"Action": "\u64cd\u4f5c",
+"Shortcut": "\u5feb\u6377\u952e",
+"Help": "\u5e2e\u52a9",
+"Address": "\u5730\u5740",
+"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f",
+"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f",
+"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84",
+"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355",
+"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):",
+"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a",
+"Learn more...": "\u4e86\u89e3\u66f4\u591a...",
+"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}",
+"Plugins": "\u63d2\u4ef6",
+"Handy Shortcuts": "\u5feb\u6377\u952e",
+"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
+"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
+"Image description": "\u56fe\u7247\u63cf\u8ff0",
+"Source": "\u5730\u5740",
+"Dimensions": "\u5927\u5c0f",
+"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
+"General": "\u666e\u901a",
+"Advanced": "\u9ad8\u7ea7",
+"Style": "\u6837\u5f0f",
+"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
+"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
+"Border": "\u8fb9\u6846",
+"Insert image": "\u63d2\u5165\u56fe\u7247",
+"Image...": "\u56fe\u7247...",
+"Image list": "\u56fe\u7247\u5217\u8868",
+"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
+"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
+"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
+"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
+"Edit image": "\u7f16\u8f91\u56fe\u7247",
+"Image options": "\u56fe\u7247\u9009\u9879",
+"Zoom in": "\u653e\u5927",
+"Zoom out": "\u7f29\u5c0f",
+"Crop": "\u88c1\u526a",
+"Resize": "\u8c03\u6574\u5927\u5c0f",
+"Orientation": "\u65b9\u5411",
+"Brightness": "\u4eae\u5ea6",
+"Sharpen": "\u9510\u5316",
+"Contrast": "\u5bf9\u6bd4\u5ea6",
+"Color levels": "\u989c\u8272\u5c42\u6b21",
+"Gamma": "\u4f3d\u9a6c\u503c",
+"Invert": "\u53cd\u8f6c",
+"Apply": "\u5e94\u7528",
+"Back": "\u540e\u9000",
+"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
+"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
+"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
+"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
+"Text to display": "\u663e\u793a\u6587\u5b57",
+"Url": "\u5730\u5740",
+"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...",
+"Current window": "\u5f53\u524d\u7a97\u53e3",
+"None": "\u65e0",
+"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
+"Remove link": "\u5220\u9664\u94fe\u63a5",
+"Anchors": "\u951a\u70b9",
+"Link...": "\u94fe\u63a5...",
+"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
+"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
+"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
+"Link list": "\u94fe\u63a5\u5217\u8868",
+"Insert video": "\u63d2\u5165\u89c6\u9891",
+"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
+"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
+"Alternative source": "\u955c\u50cf",
+"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740",
+"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)",
+"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
+"Embed": "\u5185\u5d4c",
+"Media...": "\u591a\u5a92\u4f53...",
+"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
+"Page break": "\u5206\u9875\u7b26",
+"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
+"Preview": "\u9884\u89c8",
+"Print...": "\u6253\u5370...",
+"Save": "\u4fdd\u5b58",
+"Find": "\u67e5\u627e",
+"Replace with": "\u66ff\u6362\u4e3a",
+"Replace": "\u66ff\u6362",
+"Replace all": "\u5168\u90e8\u66ff\u6362",
+"Previous": "\u4e0a\u4e00\u4e2a",
+"Next": "\u4e0b\u4e00\u4e2a",
+"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...",
+"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
+"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
+"Find whole words only": "\u5168\u5b57\u5339\u914d",
+"Spell check": "\u62fc\u5199\u68c0\u67e5",
+"Ignore": "\u5ffd\u7565",
+"Ignore all": "\u5168\u90e8\u5ffd\u7565",
+"Finish": "\u5b8c\u6210",
+"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
+"Insert table": "\u63d2\u5165\u8868\u683c",
+"Table properties": "\u8868\u683c\u5c5e\u6027",
+"Delete table": "\u5220\u9664\u8868\u683c",
+"Cell": "\u5355\u5143\u683c",
+"Row": "\u884c",
+"Column": "\u5217",
+"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
+"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
+"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
+"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
+"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
+"Delete row": "\u5220\u9664\u884c",
+"Row properties": "\u884c\u5c5e\u6027",
+"Cut row": "\u526a\u5207\u884c",
+"Copy row": "\u590d\u5236\u884c",
+"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
+"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
+"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
+"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
+"Delete column": "\u5220\u9664\u5217",
+"Cols": "\u5217",
+"Rows": "\u884c",
+"Width": "\u5bbd",
+"Height": "\u9ad8",
+"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
+"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
+"Show caption": "\u663e\u793a\u6807\u9898",
+"Left": "\u5de6\u5bf9\u9f50",
+"Center": "\u5c45\u4e2d",
+"Right": "\u53f3\u5bf9\u9f50",
+"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
+"Scope": "\u8303\u56f4",
+"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
+"H Align": "\u6c34\u5e73\u5bf9\u9f50",
+"V Align": "\u5782\u76f4\u5bf9\u9f50",
+"Top": "\u9876\u90e8\u5bf9\u9f50",
+"Middle": "\u5782\u76f4\u5c45\u4e2d",
+"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
+"Header cell": "\u8868\u5934\u5355\u5143\u683c",
+"Row group": "\u884c\u7ec4",
+"Column group": "\u5217\u7ec4",
+"Row type": "\u884c\u7c7b\u578b",
+"Header": "\u8868\u5934",
+"Body": "\u8868\u4f53",
+"Footer": "\u8868\u5c3e",
+"Border color": "\u8fb9\u6846\u989c\u8272",
+"Insert template...": "\u63d2\u5165\u6a21\u677f...",
+"Templates": "\u6a21\u677f",
+"Template": "\u6a21\u677f",
+"Text color": "\u6587\u5b57\u989c\u8272",
+"Background color": "\u80cc\u666f\u8272",
+"Custom...": "\u81ea\u5b9a\u4e49...",
+"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
+"No color": "\u65e0",
+"Remove color": "\u79fb\u9664\u989c\u8272",
+"Table of Contents": "\u5185\u5bb9\u5217\u8868",
+"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
+"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
+"Word count": "\u5b57\u6570",
+"Count": "\u8ba1\u6570",
+"Document": "\u6587\u6863",
+"Selection": "\u9009\u62e9",
+"Words": "\u5355\u8bcd",
+"Words: {0}": "\u5b57\u6570\uff1a{0}",
+"{0} words": "{0} \u5b57",
+"File": "\u6587\u4ef6",
+"Edit": "\u7f16\u8f91",
+"Insert": "\u63d2\u5165",
+"View": "\u89c6\u56fe",
+"Format": "\u683c\u5f0f",
+"Table": "\u8868\u683c",
+"Tools": "\u5de5\u5177",
+"Powered by {0}": "\u7531{0}\u9a71\u52a8",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
+"Image title": "\u56fe\u7247\u6807\u9898",
+"Border width": "\u8fb9\u6846\u5bbd\u5ea6",
+"Border style": "\u8fb9\u6846\u6837\u5f0f",
+"Error": "\u9519\u8bef",
+"Warn": "\u8b66\u544a",
+"Valid": "\u6709\u6548",
+"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846",
+"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002",
+"System Font": "\u7cfb\u7edf\u5b57\u4f53",
+"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}",
+"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}",
+"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}",
+"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}",
+"example": "\u793a\u4f8b",
+"Search": "\u641c\u7d22",
+"All": "\u5168\u90e8",
+"Currency": "\u8d27\u5e01",
+"Text": "\u6587\u5b57",
+"Quotations": "\u5f15\u7528",
+"Mathematical": "\u6570\u5b66",
+"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145",
+"Symbols": "\u7b26\u53f7",
+"Arrows": "\u7bad\u5934",
+"User Defined": "\u81ea\u5b9a\u4e49",
+"dollar sign": "\u7f8e\u5143\u7b26\u53f7",
+"currency sign": "\u8d27\u5e01\u7b26\u53f7",
+"euro-currency sign": "\u6b27\u5143\u7b26\u53f7",
+"colon sign": "\u5192\u53f7",
+"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7",
+"french franc sign": "\u6cd5\u90ce\u7b26\u53f7",
+"lira sign": "\u91cc\u62c9\u7b26\u53f7",
+"mill sign": "\u5bc6\u5c14\u7b26\u53f7",
+"naira sign": "\u5948\u62c9\u7b26\u53f7",
+"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7",
+"rupee sign": "\u5362\u6bd4\u7b26\u53f7",
+"won sign": "\u97e9\u5143\u7b26\u53f7",
+"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7",
+"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7",
+"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7",
+"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7",
+"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7",
+"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7",
+"peso sign": "\u6bd4\u7d22\u7b26\u53f7",
+"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7",
+"austral sign": "\u6fb3\u5143\u7b26\u53f7",
+"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7",
+"cedi sign": "\u585e\u5730\u7b26\u53f7",
+"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7",
+"spesmilo sign": "spesmilo\u7b26\u53f7",
+"tenge sign": "\u575a\u6208\u7b26\u53f7",
+"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4",
+"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9",
+"nordic mark sign": "\u5317\u6b27\u9a6c\u514b",
+"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7",
+"ruble sign": "\u5362\u5e03\u7b26\u53f7",
+"yen character": "\u65e5\u5143\u5b57\u6837",
+"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837",
+"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09",
+"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09",
+"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...",
+"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7",
+"People": "\u4eba\u7c7b",
+"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136",
+"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1",
+"Activity": "\u6d3b\u52a8",
+"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9",
+"Objects": "\u7269\u4ef6",
+"Flags": "\u65d7\u5e1c",
+"Characters": "\u5b57\u7b26",
+"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)",
+"{0} characters": "{0} \u4e2a\u5b57\u7b26",
+"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002",
+"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002",
+"Update": "\u66f4\u65b0",
+"Color swatch": "\u989c\u8272\u6837\u672c",
+"Turquoise": "\u9752\u7eff\u8272",
+"Green": "\u7eff\u8272",
+"Blue": "\u84dd\u8272",
+"Purple": "\u7d2b\u8272",
+"Navy Blue": "\u6d77\u519b\u84dd",
+"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272",
+"Dark Green": "\u6df1\u7eff\u8272",
+"Medium Blue": "\u4e2d\u84dd\u8272",
+"Medium Purple": "\u4e2d\u7d2b\u8272",
+"Midnight Blue": "\u6df1\u84dd\u8272",
+"Yellow": "\u9ec4\u8272",
+"Orange": "\u6a59\u8272",
+"Red": "\u7ea2\u8272",
+"Light Gray": "\u6d45\u7070\u8272",
+"Gray": "\u7070\u8272",
+"Dark Yellow": "\u6697\u9ec4\u8272",
+"Dark Orange": "\u6df1\u6a59\u8272",
+"Dark Red": "\u6df1\u7ea2\u8272",
+"Medium Gray": "\u4e2d\u7070\u8272",
+"Dark Gray": "\u6df1\u7070\u8272",
+"Light Green": "\u6d45\u7eff\u8272",
+"Light Yellow": "\u6d45\u9ec4\u8272",
+"Light Red": "\u6d45\u7ea2\u8272",
+"Light Purple": "\u6d45\u7d2b\u8272",
+"Light Blue": "\u6d45\u84dd\u8272",
+"Dark Purple": "\u6df1\u7d2b\u8272",
+"Dark Blue": "\u6df1\u84dd\u8272",
+"Black": "\u9ed1\u8272",
+"White": "\u767d\u8272",
+"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f",
+"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846",
+"history": "\u5386\u53f2",
+"styles": "\u6837\u5f0f",
+"formatting": "\u683c\u5f0f\u5316",
+"alignment": "\u5bf9\u9f50",
+"indentation": "\u7f29\u8fdb",
+"permanent pen": "\u8bb0\u53f7\u7b14",
+"comments": "\u5907\u6ce8",
+"Format Painter": "\u683c\u5f0f\u5237",
+"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6",
+"Capitalization": "\u5927\u5199",
+"lowercase": "\u5c0f\u5199",
+"UPPERCASE": "\u5927\u5199",
+"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199",
+"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027",
+"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...",
+"Font": "\u5b57\u4f53",
+"Size": "\u5b57\u53f7",
+"More...": "\u66f4\u591a...",
+"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00",
+"Select...": "\u9009\u62e9...",
+"Preferences": "\u9996\u9009\u9879",
+"Yes": "\u662f",
+"No": "\u5426",
+"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15",
+"Version": "\u7248\u672c",
+"Anchor": "\u951a\u70b9",
+"Special character": "\u7279\u6b8a\u7b26\u53f7",
+"Code sample": "\u4ee3\u7801\u793a\u4f8b",
+"Color": "\u989c\u8272",
+"Emoticons": "\u8868\u60c5",
+"Document properties": "\u6587\u6863\u5c5e\u6027",
+"Image": "\u56fe\u7247",
+"Insert link": "\u63d2\u5165\u94fe\u63a5",
+"Target": "\u6253\u5f00\u65b9\u5f0f",
+"Link": "\u94fe\u63a5",
+"Poster": "\u5c01\u9762",
+"Media": "\u5a92\u4f53",
+"Print": "\u6253\u5370",
+"Prev": "\u4e0a\u4e00\u4e2a",
+"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
+"Whole words": "\u5168\u5b57\u5339\u914d",
+"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
+"Caption": "\u6807\u9898",
+"Insert template": "\u63d2\u5165\u6a21\u677f"
+});
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/views/system/build/utils/db.js b/acs/nladmin-ui/src/views/system/build/utils/db.js
new file mode 100644
index 0000000..2409f3d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/utils/db.js
@@ -0,0 +1,54 @@
+const DRAWING_ITEMS = 'drawingItems'
+const DRAWING_ITEMS_VERSION = '1.2'
+const DRAWING_ITEMS_VERSION_KEY = 'DRAWING_ITEMS_VERSION'
+const DRAWING_ID = 'idGlobal'
+const TREE_NODE_ID = 'treeNodeId'
+const FORM_CONF = 'formConf'
+
+export function getDrawingList() {
+ // 加入缓存版本的概念,保证缓存数据与程序匹配
+ const version = localStorage.getItem(DRAWING_ITEMS_VERSION_KEY)
+ if (version !== DRAWING_ITEMS_VERSION) {
+ localStorage.setItem(DRAWING_ITEMS_VERSION_KEY, DRAWING_ITEMS_VERSION)
+ saveDrawingList([])
+ return null
+ }
+
+ const str = localStorage.getItem(DRAWING_ITEMS)
+ if (str) return JSON.parse(str)
+ return null
+}
+
+export function saveDrawingList(list) {
+ localStorage.setItem(DRAWING_ITEMS, JSON.stringify(list))
+}
+
+export function getIdGlobal() {
+ const str = localStorage.getItem(DRAWING_ID)
+ if (str) return parseInt(str, 10)
+ return 100
+}
+
+export function saveIdGlobal(id) {
+ localStorage.setItem(DRAWING_ID, `${id}`)
+}
+
+export function getTreeNodeId() {
+ const str = localStorage.getItem(TREE_NODE_ID)
+ if (str) return parseInt(str, 10)
+ return 100
+}
+
+export function saveTreeNodeId(id) {
+ localStorage.setItem(TREE_NODE_ID, `${id}`)
+}
+
+export function getFormConf() {
+ const str = localStorage.getItem(FORM_CONF)
+ if (str) return JSON.parse(str)
+ return null
+}
+
+export function saveFormConf(obj) {
+ localStorage.setItem(FORM_CONF, JSON.stringify(obj))
+}
diff --git a/acs/nladmin-ui/src/views/system/build/utils/icon.json b/acs/nladmin-ui/src/views/system/build/utils/icon.json
new file mode 100644
index 0000000..2d9999a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/utils/icon.json
@@ -0,0 +1 @@
+["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"]
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/views/system/build/utils/index.js b/acs/nladmin-ui/src/views/system/build/utils/index.js
new file mode 100644
index 0000000..a704a65
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/utils/index.js
@@ -0,0 +1,441 @@
+import { parseTime } from '@/views/system/build/utils/rouyi'
+
+/**
+ * 表格时间格式化
+ */
+export function formatDate(cellValue) {
+ if (cellValue == null || cellValue == '') return ''
+ var date = new Date(cellValue)
+ var year = date.getFullYear()
+ var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
+ var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
+ var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
+ var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
+ var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
+ return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+ if (('' + time).length === 10) {
+ time = parseInt(time) * 1000
+ } else {
+ time = +time
+ }
+ const d = new Date(time)
+ const now = Date.now()
+
+ const diff = (now - d) / 1000
+
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ return parseTime(time, option)
+ } else {
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
+ }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+ url = url == null ? window.location.href : url
+ const search = url.substring(url.lastIndexOf('?') + 1)
+ const obj = {}
+ const reg = /([^?&=]+)=([^?&=]*)/g
+ search.replace(reg, (rs, $1, $2) => {
+ const name = decodeURIComponent($1)
+ let val = decodeURIComponent($2)
+ val = String(val)
+ obj[name] = val
+ return rs
+ })
+ return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+ // returns the byte length of an utf8 string
+ let s = str.length
+ for (var i = str.length - 1; i >= 0; i--) {
+ const code = str.charCodeAt(i)
+ if (code > 0x7f && code <= 0x7ff) s++
+ else if (code > 0x7ff && code <= 0xffff) s += 2
+ if (code >= 0xDC00 && code <= 0xDFFF) i--
+ }
+ return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+ const newArray = []
+ for (let i = 0; i < actual.length; i++) {
+ if (actual[i]) {
+ newArray.push(actual[i])
+ }
+ }
+ return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+ if (!json) return ''
+ return cleanArray(
+ Object.keys(json).map(key => {
+ if (json[key] === undefined) return ''
+ return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ })
+ ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+ const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+ if (!search) {
+ return {}
+ }
+ const obj = {}
+ const searchArr = search.split('&')
+ searchArr.forEach(v => {
+ const index = v.indexOf('=')
+ if (index !== -1) {
+ const name = v.substring(0, index)
+ const val = v.substring(index + 1, v.length)
+ obj[name] = val
+ }
+ })
+ return obj
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+ const div = document.createElement('div')
+ div.innerHTML = val
+ return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+ if (typeof target !== 'object') {
+ target = {}
+ }
+ if (Array.isArray(source)) {
+ return source.slice()
+ }
+ Object.keys(source).forEach(property => {
+ const sourceProperty = source[property]
+ if (typeof sourceProperty === 'object') {
+ target[property] = objectMerge(target[property], sourceProperty)
+ } else {
+ target[property] = sourceProperty
+ }
+ })
+ return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+ if (!element || !className) {
+ return
+ }
+ let classString = element.className
+ const nameIndex = classString.indexOf(className)
+ if (nameIndex === -1) {
+ classString += '' + className
+ } else {
+ classString =
+ classString.substr(0, nameIndex) +
+ classString.substr(nameIndex + className.length)
+ }
+ element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+ if (type === 'start') {
+ return new Date().getTime() - 3600 * 1000 * 24 * 90
+ } else {
+ return new Date(new Date().toDateString())
+ }
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+ let timeout, args, context, timestamp, result
+
+ const later = function() {
+ // 据上一次触发时间间隔
+ const last = +new Date() - timestamp
+
+ // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
+ if (last < wait && last > 0) {
+ timeout = setTimeout(later, wait - last)
+ } else {
+ timeout = null
+ // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+ if (!immediate) {
+ result = func.apply(context, args)
+ if (!timeout) context = args = null
+ }
+ }
+ }
+
+ return function(...args) {
+ context = this
+ timestamp = +new Date()
+ const callNow = immediate && !timeout
+ // 如果延时不存在,重新设定延时
+ if (!timeout) timeout = setTimeout(later, wait)
+ if (callNow) {
+ result = func.apply(context, args)
+ context = args = null
+ }
+
+ return result
+ }
+}
+
+// /**
+// * This is just a simple version of deep copy
+// * Has a lot of edge cases bug
+// * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+// * @param {Object} source
+// * @returns {Object}
+// */
+// export function deepClone(source) {
+// if (!source && typeof source !== 'object') {
+// throw new Error('error arguments', 'deepClone')
+// }
+// const targetObj = source.constructor === Array ? [] : {}
+// Object.keys(source).forEach(keys => {
+// if (source[keys] && typeof source[keys] === 'object') {
+// targetObj[keys] = deepClone(source[keys])
+// } else {
+// targetObj[keys] = source[keys]
+// }
+// })
+// return targetObj
+// }
+
+// 深拷贝对象
+// add by 芋道源码 https://github.com/JakHuang/form-generator/blob/dev/src/utils/index.js#L107
+export function deepClone(obj) {
+ const _toString = Object.prototype.toString
+
+ // null, undefined, non-object, function
+ if (!obj || typeof obj !== 'object') {
+ return obj
+ }
+
+ // DOM Node
+ if (obj.nodeType && 'cloneNode' in obj) {
+ return obj.cloneNode(true)
+ }
+
+ // Date
+ if (_toString.call(obj) === '[object Date]') {
+ return new Date(obj.getTime())
+ }
+
+ // RegExp
+ if (_toString.call(obj) === '[object RegExp]') {
+ const flags = []
+ if (obj.global) { flags.push('g') }
+ if (obj.multiline) { flags.push('m') }
+ if (obj.ignoreCase) { flags.push('i') }
+
+ return new RegExp(obj.source, flags.join(''))
+ }
+
+ const result = Array.isArray(obj) ? [] : obj.constructor ? new obj.constructor() : {}
+
+ for (const key in obj) {
+ result[key] = deepClone(obj[key])
+ }
+
+ return result
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+ return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+ const timestamp = +new Date() + ''
+ const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+ return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+ return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+ if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+ if (hasClass(ele, cls)) {
+ const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+ ele.className = ele.className.replace(reg, ' ')
+ }
+}
+
+export function makeMap(str, expectsLowerCase) {
+ const map = Object.create(null)
+ const list = str.split(',')
+ for (let i = 0; i < list.length; i++) {
+ map[list[i]] = true
+ }
+ return expectsLowerCase
+ ? val => map[val.toLowerCase()]
+ : val => map[val]
+}
+
+export const exportDefault = 'export default '
+
+export const beautifierConf = {
+ html: {
+ indent_size: '2',
+ indent_char: ' ',
+ max_preserve_newlines: '-1',
+ preserve_newlines: false,
+ keep_array_indentation: false,
+ break_chained_methods: false,
+ indent_scripts: 'separate',
+ brace_style: 'end-expand',
+ space_before_conditional: true,
+ unescape_strings: false,
+ jslint_happy: false,
+ end_with_newline: true,
+ wrap_line_length: '110',
+ indent_inner_html: true,
+ comma_first: false,
+ e4x: true,
+ indent_empty_lines: true
+ },
+ js: {
+ indent_size: '2',
+ indent_char: ' ',
+ max_preserve_newlines: '-1',
+ preserve_newlines: false,
+ keep_array_indentation: false,
+ break_chained_methods: false,
+ indent_scripts: 'normal',
+ brace_style: 'end-expand',
+ space_before_conditional: true,
+ unescape_strings: false,
+ jslint_happy: true,
+ end_with_newline: true,
+ wrap_line_length: '110',
+ indent_inner_html: true,
+ comma_first: false,
+ e4x: true,
+ indent_empty_lines: true
+ }
+}
+
+// 首字母大小
+export function titleCase(str) {
+ return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
+}
+
+// 下划转驼峰
+export function camelCase(str) {
+ return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
+}
+
+export function isNumberStr(str) {
+ return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
+}
+
+// -转驼峰
+export function toCamelCase(str, upperCaseFirst) {
+ str = (str || '').toLowerCase().replace(/-(.)/g, function(match, group1) {
+ return group1.toUpperCase()
+ })
+
+ if (upperCaseFirst && str) {
+ str = str.charAt(0).toUpperCase() + str.slice(1)
+ }
+
+ return str
+}
diff --git a/acs/nladmin-ui/src/views/system/build/utils/loadBeautifier.js b/acs/nladmin-ui/src/views/system/build/utils/loadBeautifier.js
new file mode 100644
index 0000000..db8ab3e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/utils/loadBeautifier.js
@@ -0,0 +1,28 @@
+import loadScript from './loadScript'
+import ELEMENT from 'element-ui'
+import pluginsConfig from '../config/pluginsConfig'
+
+let beautifierObj
+
+export default function loadBeautifier(cb) {
+ const { beautifierUrl } = pluginsConfig
+ if (beautifierObj) {
+ cb(beautifierObj)
+ return
+ }
+
+ const loading = ELEMENT.Loading.service({
+ fullscreen: true,
+ lock: true,
+ text: '格式化资源加载中...',
+ spinner: 'el-icon-loading',
+ background: 'rgba(255, 255, 255, 0.5)'
+ })
+
+ loadScript(beautifierUrl, () => {
+ loading.close()
+ // eslint-disable-next-line no-undef
+ beautifierObj = beautifier
+ cb(beautifierObj)
+ })
+}
diff --git a/acs/nladmin-ui/src/views/system/build/utils/loadMonaco.js b/acs/nladmin-ui/src/views/system/build/utils/loadMonaco.js
new file mode 100644
index 0000000..28b1e6a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/utils/loadMonaco.js
@@ -0,0 +1,40 @@
+import loadScript from './loadScript'
+import ELEMENT from 'element-ui'
+import pluginsConfig from '../config/pluginsConfig'
+
+// monaco-editor单例
+let monacoEidtor // 代码编辑器
+
+/**
+ * 动态加载monaco-editor cdn资源
+ * @param {Function} cb 回调,必填
+ */
+export default function loadMonaco(cb) {
+ if (monacoEidtor) {
+ cb(monacoEidtor)
+ return
+ }
+
+ const { monacoEditorUrl: vs } = pluginsConfig
+
+ // 使用element ui实现加载提示
+ const loading = ELEMENT.Loading.service({
+ fullscreen: true,
+ lock: true,
+ text: '编辑器资源初始化中...',
+ spinner: 'el-icon-loading',
+ background: 'rgba(255, 255, 255, 0.5)'
+ })
+
+ !window.require && (window.require = {})
+ !window.require.paths && (window.require.paths = {})
+ window.require.paths.vs = vs
+
+ loadScript(`${vs}/loader.js`, () => {
+ window.require(['vs/editor/editor.main'], () => {
+ loading.close()
+ monacoEidtor = window.monaco
+ cb(monacoEidtor)
+ })
+ })
+}
diff --git a/acs/nladmin-ui/src/views/system/build/utils/loadScript.js b/acs/nladmin-ui/src/views/system/build/utils/loadScript.js
new file mode 100644
index 0000000..18112fd
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/utils/loadScript.js
@@ -0,0 +1,60 @@
+const callbacks = {}
+
+/**
+ * 加载一个远程脚本
+ * @param {String} src 一个远程脚本
+ * @param {Function} callback 回调
+ */
+function loadScript(src, callback) {
+ const existingScript = document.getElementById(src)
+ const cb = callback || (() => {})
+ if (!existingScript) {
+ callbacks[src] = []
+ const $script = document.createElement('script')
+ $script.src = src
+ $script.id = src
+ $script.async = 1
+ document.body.appendChild($script)
+ const onEnd = 'onload' in $script ? stdOnEnd.bind($script) : ieOnEnd.bind($script)
+ onEnd($script)
+ }
+
+ callbacks[src].push(cb)
+
+ function stdOnEnd(script) {
+ script.onload = () => {
+ this.onerror = this.onload = null
+ callbacks[src].forEach(item => {
+ item(null, script)
+ })
+ delete callbacks[src]
+ }
+ script.onerror = () => {
+ this.onerror = this.onload = null
+ cb(new Error(`Failed to load ${src}`), script)
+ }
+ }
+
+ function ieOnEnd(script) {
+ script.onreadystatechange = () => {
+ if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
+ this.onreadystatechange = null
+ callbacks[src].forEach(item => {
+ item(null, script)
+ })
+ delete callbacks[src]
+ }
+ }
+}
+
+/**
+ * 顺序加载一组远程脚本
+ * @param {Array} list 一组远程脚本
+ * @param {Function} cb 回调
+ */
+export function loadScriptQueue(list, cb) {
+ const first = list.shift()
+ list.length ? loadScript(first, () => loadScriptQueue(list, cb)) : loadScript(first, cb)
+}
+
+export default loadScript
diff --git a/acs/nladmin-ui/src/views/system/build/utils/loadTinymce.js b/acs/nladmin-ui/src/views/system/build/utils/loadTinymce.js
new file mode 100644
index 0000000..e7fadb0
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/utils/loadTinymce.js
@@ -0,0 +1,29 @@
+import loadScript from './loadScript'
+import ELEMENT from 'element-ui'
+import pluginsConfig from '../config/pluginsConfig'
+
+let tinymceObj
+
+export default function loadTinymce(cb) {
+ const { tinymceUrl } = pluginsConfig
+
+ if (tinymceObj) {
+ cb(tinymceObj)
+ return
+ }
+
+ const loading = ELEMENT.Loading.service({
+ fullscreen: true,
+ lock: true,
+ text: '富文本资源加载中...',
+ spinner: 'el-icon-loading',
+ background: 'rgba(255, 255, 255, 0.5)'
+ })
+
+ loadScript(tinymceUrl, () => {
+ loading.close()
+ // eslint-disable-next-line no-undef
+ tinymceObj = tinymce
+ cb(tinymceObj)
+ })
+}
diff --git a/acs/nladmin-ui/src/views/system/build/utils/rouyi.js b/acs/nladmin-ui/src/views/system/build/utils/rouyi.js
new file mode 100644
index 0000000..3f69609
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/build/utils/rouyi.js
@@ -0,0 +1,224 @@
+/**
+ * 通用js方法封装处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+const baseURL = process.env.VUE_APP_BASE_API
+
+// 日期格式化
+export function parseTime(time, pattern) {
+ if (arguments.length === 0 || !time) {
+ return null
+ }
+ const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+ time = parseInt(time)
+ } else if (typeof time === 'string') {
+ time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '')
+ }
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+ let value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') {
+ return ['日', '一', '二', '三', '四', '五', '六'][value]
+ }
+ if (result.length > 0 && value < 10) {
+ value = '0' + value
+ }
+ return value || 0
+ })
+ return time_str
+}
+
+// 表单重置
+export function resetForm(refName) {
+ if (this.$refs[refName]) {
+ this.$refs[refName].resetFields()
+ }
+}
+
+// 添加日期范围
+export function addDateRange(params, dateRange, propName) {
+ const search = params
+ search.params = {}
+ if (dateRange != null && dateRange !== '') {
+ if (typeof (propName) === 'undefined') {
+ search['beginTime'] = dateRange[0]
+ search['endTime'] = dateRange[1]
+ } else {
+ search['begin' + propName] = dateRange[0]
+ search['end' + propName] = dateRange[1]
+ }
+ }
+ return search
+}
+
+/**
+ * 添加开始和结束时间到 params 参数中
+ *
+ * @param params 参数
+ * @param dateRange 时间范围。
+ * 大小为 2 的数组,每个时间为 yyyy-MM-dd 格式
+ * @param propName 加入的参数名,可以为空
+ */
+export function addBeginAndEndTime(params, dateRange, propName) {
+ // 必须传入参数
+ if (!dateRange) {
+ return params
+ }
+ // 如果未传递 propName 属性,默认为 time
+ if (!propName) {
+ propName = 'Time'
+ } else {
+ propName = propName.charAt(0).toUpperCase() + propName.slice(1)
+ }
+ // 设置参数
+ if (dateRange[0]) {
+ params['begin' + propName] = dateRange[0] + ' 00:00:00'
+ }
+ if (dateRange[1]) {
+ params['end' + propName] = dateRange[1] + ' 23:59:59'
+ }
+ return params
+}
+
+// 字符串格式化(%s )
+export function sprintf(str) {
+ var args = arguments; var flag = true; var i = 1
+ str = str.replace(/%s/g, function() {
+ var arg = args[i++]
+ if (typeof arg === 'undefined') {
+ flag = false
+ return ''
+ }
+ return arg
+ })
+ return flag ? str : ''
+}
+
+// 转换字符串,undefined,null等转化为""
+export function praseStrEmpty(str) {
+ if (!str || str == 'undefined' || str == 'null') {
+ return ''
+ }
+ return str
+}
+
+/**
+ * 构造树型结构数据
+ * @param {*} data 数据源
+ * @param {*} id id字段 默认 'id'
+ * @param {*} parentId 父节点字段 默认 'parentId'
+ * @param {*} children 孩子节点字段 默认 'children'
+ * @param {*} rootId 根Id 默认 0
+ */
+export function handleTree(data, id, parentId, children, rootId) {
+ id = id || 'id'
+ parentId = parentId || 'parentId'
+ children = children || 'children'
+ rootId = rootId || Math.min.apply(Math, data.map(item => {
+ return item[parentId]
+ })) || 0
+ // 对源数据深度克隆
+ const cloneData = JSON.parse(JSON.stringify(data))
+ // 循环所有项
+ const treeData = cloneData.filter(father => {
+ const branchArr = cloneData.filter(child => {
+ // 返回每一项的子级数组
+ return father[id] === child[parentId]
+ })
+ branchArr.length > 0 ? father.children = branchArr : ''
+ // 返回第一层
+ return father[parentId] === rootId
+ })
+ return treeData !== '' ? treeData : data
+}
+
+/**
+ * 获取当前时间
+ * @param timeStr 时分秒 字符串 格式为 xx:xx:xx
+ */
+export function getNowDateTime(timeStr) {
+ const now = new Date()
+ const year = now.getFullYear() // 得到年份
+ const month = (now.getMonth() + 1).toString().padStart(2, '0') // 得到月份
+ const day = now.getDate().toString().padStart(2, '0') // 得到日期
+
+ if (timeStr != null) {
+ return `${year}-${month}-${day} ${timeStr}`
+ }
+ const hours = now.getHours().toString().padStart(2, '0') // 得到小时;
+ const minutes = now.getMinutes().toString().padStart(2, '0') // 得到分钟;
+ const seconds = now.getSeconds().toString().padStart(2, '0') // 得到秒;
+ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
+}
+
+/**
+ * 获得租户功能是否开启
+ */
+export function getTenantEnable() {
+ // console.log("enable: " + process.env.VUE_APP_TENANT_ENABLE)
+ if (process.env.VUE_APP_TENANT_ENABLE === 'true') {
+ return true
+ }
+ if (process.env.VUE_APP_TENANT_ENABLE === 'false') {
+ return false
+ }
+ return process.env.VUE_APP_TENANT_ENABLE || true
+}
+
+/**
+ * 获得文档是否开启
+ */
+export function getDocEnable() {
+ if (process.env.VUE_APP_DOC_ENABLE === 'true') {
+ return true
+ }
+ if (process.env.VUE_APP_DOC_ENABLE === 'false') {
+ return false
+ }
+ return process.env.VUE_APP_DOC_ENABLE || false
+}
+
+/**
+ * 获得 Vue 应用的基础路径
+ */
+export function getBasePath() {
+ return process.env.VUE_APP_APP_NAME || '/'
+}
+
+/**
+ * 获得 Vue 应用的访问路径
+ *
+ * @param path 路径
+ */
+export function getPath(path) {
+ // 基础路径,必须以 / 结尾
+ const basePath = getBasePath()
+ if (!basePath.endsWith('/')) {
+ return basePath + '/'
+ }
+ // 访问路径,必须不能以 / 开头
+ if (path.startsWith('/')) {
+ path = path.substring(1)
+ }
+ return basePath + path
+}
diff --git a/acs/nladmin-ui/src/views/system/dept/index.vue b/acs/nladmin-ui/src/views/system/dept/index.vue
new file mode 100644
index 0000000..e5c87df
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/dept/index.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/dict/dictDetail.vue b/acs/nladmin-ui/src/views/system/dict/dictDetail.vue
new file mode 100644
index 0000000..b6e2554
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/dict/dictDetail.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ query.dictName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/dict/index.vue b/acs/nladmin-ui/src/views/system/dict/index.vue
new file mode 100644
index 0000000..c205c56
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/dict/index.vue
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 字典详情
+ 新增
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/grid/index.vue b/acs/nladmin-ui/src/views/system/grid/index.vue
new file mode 100644
index 0000000..2593a07
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/grid/index.vue
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+
+
+
+ 添加字段
+
+
+
+
+
+
+
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/grid/table.vue b/acs/nladmin-ui/src/views/system/grid/table.vue
new file mode 100644
index 0000000..e91dfde
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/grid/table.vue
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/Diagram.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/Diagram.vue
new file mode 100644
index 0000000..5dd9d57
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/Diagram.vue
@@ -0,0 +1,586 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/DiagramSidebar.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/DiagramSidebar.vue
new file mode 100644
index 0000000..75eb620
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/DiagramSidebar.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/DiagramToolbar.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/DiagramToolbar.vue
new file mode 100644
index 0000000..3b2394b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/DiagramToolbar.vue
@@ -0,0 +1,275 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 舞台:
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/PropertyPanel.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/PropertyPanel.vue
new file mode 100644
index 0000000..d97dc0d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/PropertyPanel.vue
@@ -0,0 +1,420 @@
+
+
+
+
+
+
背景色
+
+ $_changeColorProperty(c, 'backgroundColor')" />
+
+
+
渐变色
+
+ $_changeColorProperty(c, 'gradientColor')" />
+
+
+
+
+ 设备绑定
+
+
+ {{ item.device_code }}
+ {{ item.device_name }}
+
+
+
+
+ 旋转角度
+
+ 度
+
+
+ 设备选择
+
+
+
+
+
+
+
线条颜色
+
+ $_changeColorProperty(c, 'borderColor')" />
+
+
+
+
+ 线条宽度
+
+
+
+
+
+
文本颜色
+
+ $_changeColorProperty(c, 'fontColor')" />
+
+
+
+
+ 文本大小
+
+ px
+
+
+ 文本字体
+
+
+
+
+
+ 文本行高
+
+
+
+
+
+ 文本对齐
+
+ 左对齐
+ 居中
+ 右对齐
+
+
+
+ 文本样式
+ B
+ U
+ I
+
+
+ 置为顶部
+ 置为底部
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Actor.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Actor.vue
new file mode 100644
index 0000000..dc3818d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Actor.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/AreaSelect.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/AreaSelect.vue
new file mode 100644
index 0000000..edb8929
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/AreaSelect.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Blod.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Blod.vue
new file mode 100644
index 0000000..3444a37
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Blod.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Circle.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Circle.vue
new file mode 100644
index 0000000..b8355a4
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Circle.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ColorFill.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ColorFill.vue
new file mode 100644
index 0000000..1c12d2a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ColorFill.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ColorText.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ColorText.vue
new file mode 100644
index 0000000..8aa7da1
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ColorText.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Cross.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Cross.vue
new file mode 100644
index 0000000..ba01527
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Cross.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Cylinde.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Cylinde.vue
new file mode 100644
index 0000000..c32f508
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Cylinde.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Diamond.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Diamond.vue
new file mode 100644
index 0000000..ae6e48a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Diamond.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Divide.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Divide.vue
new file mode 100644
index 0000000..32bbd4f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Divide.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/DownArrow.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/DownArrow.vue
new file mode 100644
index 0000000..01de6a0
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/DownArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Ellipse.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Ellipse.vue
new file mode 100644
index 0000000..e006fee
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Ellipse.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Font.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Font.vue
new file mode 100644
index 0000000..e9a1bb2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Font.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Heptagon.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Heptagon.vue
new file mode 100644
index 0000000..1f10cb2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Heptagon.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Hexagon.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Hexagon.vue
new file mode 100644
index 0000000..1a9c513
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Hexagon.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/HorizontalArrow.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/HorizontalArrow.vue
new file mode 100644
index 0000000..640f85c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/HorizontalArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/LeftArrow.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/LeftArrow.vue
new file mode 100644
index 0000000..c62689e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/LeftArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Line.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Line.vue
new file mode 100644
index 0000000..d4b7141
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Line.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Minus.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Minus.vue
new file mode 100644
index 0000000..e8a5c19
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Minus.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Parallelogram.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Parallelogram.vue
new file mode 100644
index 0000000..1929f72
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Parallelogram.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Pentagon.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Pentagon.vue
new file mode 100644
index 0000000..1f41d42
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Pentagon.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Rect.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Rect.vue
new file mode 100644
index 0000000..5a62bb4
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Rect.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/RectRadius.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/RectRadius.vue
new file mode 100644
index 0000000..ee233aa
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/RectRadius.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/RightArrow.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/RightArrow.vue
new file mode 100644
index 0000000..5099141
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/RightArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Septagon.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Septagon.vue
new file mode 100644
index 0000000..af70242
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Septagon.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/StepBack.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/StepBack.vue
new file mode 100644
index 0000000..254da46
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/StepBack.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/StepFoward.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/StepFoward.vue
new file mode 100644
index 0000000..cd96b6b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/StepFoward.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Table.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Table.vue
new file mode 100644
index 0000000..50bdced
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Table.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Text.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Text.vue
new file mode 100644
index 0000000..c1af1cd
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Text.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Times.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Times.vue
new file mode 100644
index 0000000..cbe890c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Times.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Trapezoid.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Trapezoid.vue
new file mode 100644
index 0000000..5d23b92
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Trapezoid.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Triangle.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Triangle.vue
new file mode 100644
index 0000000..e40db56
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/Triangle.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/UpArrow.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/UpArrow.vue
new file mode 100644
index 0000000..2ce28d7
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/UpArrow.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/VerticalArrow.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/VerticalArrow.vue
new file mode 100644
index 0000000..360d21b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/VerticalArrow.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ZoomIn.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ZoomIn.vue
new file mode 100644
index 0000000..a525716
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ZoomIn.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ZoomOut.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ZoomOut.vue
new file mode 100644
index 0000000..c30a25f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/icon/ZoomOut.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/DownArrowNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/DownArrowNode.js
new file mode 100644
index 0000000..e32d3c9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/DownArrowNode.js
@@ -0,0 +1,49 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 下箭头
+
+class DownArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 50
+ this.height = 80
+ }
+}
+class DownArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowWidth = 1 / 3 * width
+ const upY = y - 1 / 2 * height
+ const downY = y + 1 / 2 * height
+ const downY2 = y + 1 / 5 * height
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [x - 1 / 2 * ArrowWidth, downY2],
+ [x - 1 / 2 * width, downY2],
+ [x, downY],
+ [x + 1 / 2 * width, downY2],
+ [x + 1 / 2 * ArrowWidth, downY2],
+ [x + 1 / 2 * ArrowWidth, upY],
+ [x - 1 / 2 * ArrowWidth, upY]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'down-arrow',
+ view: DownArrowView,
+ model: DownArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/HorizontalArrowNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/HorizontalArrowNode.js
new file mode 100644
index 0000000..0a8bf80
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/HorizontalArrowNode.js
@@ -0,0 +1,56 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 水平双箭头
+
+class HorizontalArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 40
+ }
+}
+
+class HorizontalArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowHeight = 1 / 3 * height
+ const leftX = x - 1 / 2 * width
+ const leftX2 = x - 1 / 5 * width
+ const rightX = x + 1 / 2 * width
+ const rightX2 = x + 1 / 5 * width
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ // 右箭头
+ [rightX2, y - 1 / 2 * ArrowHeight],
+ [rightX2, y - 1 / 2 * height],
+ [rightX, y],
+ [rightX2, y + 1 / 2 * height],
+ [rightX2, y + 1 / 2 * ArrowHeight],
+ // 左箭头
+ [leftX2, y + 1 / 2 * ArrowHeight],
+ [leftX2, y + 1 / 2 * height],
+ [leftX, y],
+ [leftX2, y - 1 / 2 * height],
+ [leftX2, y - 1 / 2 * ArrowHeight]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'horizontal-arrow',
+ view: HorizontalArrowView,
+ model: HorizontalArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/LeftArrow.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/LeftArrow.js
new file mode 100644
index 0000000..0405e10
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/LeftArrow.js
@@ -0,0 +1,48 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 左箭头
+class LeftArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 50
+ }
+}
+class LeftArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowHeight = 1 / 3 * height
+ const leftX = x - 1 / 2 * width
+ const leftX2 = x - 1 / 5 * width
+ const rightX = x + 1 / 2 * width
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [leftX2, y - 1 / 2 * ArrowHeight],
+ [leftX2, y - 1 / 2 * height],
+ [leftX, y],
+ [leftX2, y + 1 / 2 * height],
+ [leftX2, y + 1 / 2 * ArrowHeight],
+ [rightX, y + 1 / 2 * ArrowHeight],
+ [rightX, y - 1 / 2 * ArrowHeight]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'left-arrow',
+ view: LeftArrowView,
+ model: LeftArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/RightArrow.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/RightArrow.js
new file mode 100644
index 0000000..f963d0e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/RightArrow.js
@@ -0,0 +1,50 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 右箭头
+
+class RightArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 50
+ }
+}
+
+class RightArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowHeight = 1 / 3 * height
+ const leftX = x - 1 / 2 * width
+ const rightX = x + 1 / 2 * width
+ const rightX2 = x + 1 / 5 * width
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [rightX2, y - 1 / 2 * ArrowHeight],
+ [rightX2, y - 1 / 2 * height],
+ [rightX, y],
+ [rightX2, y + 1 / 2 * height],
+ [rightX2, y + 1 / 2 * ArrowHeight],
+ [leftX, y + 1 / 2 * ArrowHeight],
+ [leftX, y - 1 / 2 * ArrowHeight]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'right-arrow',
+ view: RightArrowView,
+ model: RightArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/UpArrowNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/UpArrowNode.js
new file mode 100644
index 0000000..ae9b538
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/UpArrowNode.js
@@ -0,0 +1,49 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 上箭头
+class UpArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 50
+ this.height = 80
+ }
+}
+
+class UpArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowWidth = 1 / 3 * width
+ const upY = y - 1 / 2 * height
+ const upY2 = y - 1 / 5 * height
+ const downY = y + 1 / 2 * height
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [x - 1 / 2 * ArrowWidth, upY2],
+ [x - 1 / 2 * width, upY2],
+ [x, upY],
+ [x + 1 / 2 * width, upY2],
+ [x + 1 / 2 * ArrowWidth, upY2],
+ [x + 1 / 2 * ArrowWidth, downY],
+ [x - 1 / 2 * ArrowWidth, downY]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'up-arrow',
+ view: UpArrowView,
+ model: UpArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/VerticalArrowNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/VerticalArrowNode.js
new file mode 100644
index 0000000..0a0fa26
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/arrow/VerticalArrowNode.js
@@ -0,0 +1,56 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 竖直箭头
+
+class VerticalArrowModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 40
+ this.height = 80
+ }
+}
+
+class VerticalArrowView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const ArrowWidth = 1 / 3 * width
+ const upY = y - 1 / 2 * height
+ const upY2 = y - 1 / 5 * height
+ const downY = y + 1 / 2 * height
+ const downY2 = y + 1 / 5 * height
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ // 上箭头
+ [x - 1 / 2 * ArrowWidth, upY2],
+ [x - 1 / 2 * width, upY2],
+ [x, upY],
+ [x + 1 / 2 * width, upY2],
+ [x + 1 / 2 * ArrowWidth, upY2],
+ // 下箭头
+ [x + 1 / 2 * ArrowWidth, downY2],
+ [x + 1 / 2 * width, downY2],
+ [x, downY],
+ [x - 1 / 2 * width, downY2],
+ [x - 1 / 2 * ArrowWidth, downY2]
+ ]
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'vertical-arrow',
+ view: VerticalArrowView,
+ model: VerticalArrowModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/BaseNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/BaseNode.js
new file mode 100644
index 0000000..6c297ce
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/BaseNode.js
@@ -0,0 +1,16 @@
+import { BaseNode, BaseNodeModel } from '@logicflow/core'
+
+class BaseNewNode extends BaseNode {
+}
+
+class BaseNewModel extends BaseNodeModel {
+ setAttributes() {
+ this.fill = 'red'
+ }
+}
+
+export default {
+ type: 'BaseNode',
+ view: BaseNewNode,
+ model: BaseNewModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/CircleNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/CircleNode.js
new file mode 100644
index 0000000..cc37250
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/CircleNode.js
@@ -0,0 +1,33 @@
+import { EllipseResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 圆形
+class CircleNewModel extends EllipseResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.rx = 35
+ this.ry = 35
+ }
+
+ setToBottom() {
+ this.zIndex = 0
+ }
+
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+export default {
+ type: 'pro-circle',
+ view: EllipseResize.view,
+ model: CircleNewModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/DiamondNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/DiamondNode.js
new file mode 100644
index 0000000..38dc315
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/DiamondNode.js
@@ -0,0 +1,35 @@
+import { DiamondResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 菱形
+/**
+ * model控制初始化的值
+ */
+class DiamondModel extends DiamondResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.rx = 35
+ this.ry = 35
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+
+ setToBottom() {
+ this.zIndex = 0
+ }
+}
+
+export default {
+ type: 'pro-diamond',
+ view: DiamondResize.view,
+ model: DiamondModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/EllipseNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/EllipseNode.js
new file mode 100644
index 0000000..c297638
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/EllipseNode.js
@@ -0,0 +1,19 @@
+import CircleNode from './CircleNode'
+
+// 椭圆
+class EllipseNewModel extends CircleNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.rx = 60
+ this.ry = 30
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ return { ...style }
+ }
+}
+export default {
+ type: 'pro-ellipse',
+ view: CircleNode.view,
+ model: EllipseNewModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/RectNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/RectNode.js
new file mode 100644
index 0000000..ee242e2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/RectNode.js
@@ -0,0 +1,27 @@
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 矩形
+class RectNewModel extends RectResize.model {
+ setToBottom() {
+ this.zIndex = 0
+ }
+
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+export default {
+ type: 'pro-rect',
+ view: RectResize.view,
+ model: RectNewModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/RectRadiusNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/RectRadiusNode.js
new file mode 100644
index 0000000..9a336d6
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/RectRadiusNode.js
@@ -0,0 +1,14 @@
+import RectNode from './RectNode'
+
+// 带圆角的矩形
+class RectRadiusModel extends RectNode.model {
+ setAttributes() {
+ super.setAttributes()
+ this.radius = 20
+ }
+}
+export default {
+ type: 'rect-radius',
+ view: RectNode.view,
+ model: RectRadiusModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/TextNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/TextNode.js
new file mode 100644
index 0000000..b3a0911
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/basic/TextNode.js
@@ -0,0 +1,37 @@
+import { TextNodeModel, TextNode } from '@logicflow/core'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 文本节点
+class TextNewNode extends TextNode {
+}
+class TextNewModel extends TextNodeModel {
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ if (properties.backgroundColor) {
+ style.backgroundStyle = {
+ fill: properties.backgroundColor
+ }
+ }
+ return getTextStyleFunction(style, properties)
+ }
+
+ setAttributes() {
+ super.setAttributes()
+ if (!this.text.value) {
+ this.text.value = 'text'
+ }
+ }
+}
+
+export default {
+ type: 'pro-text',
+ view: TextNewNode,
+ model: TextNewModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Bezier.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Bezier.js
new file mode 100644
index 0000000..ecfc48e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Bezier.js
@@ -0,0 +1,26 @@
+import { BezierEdge, BezierEdgeModel } from '@logicflow/core'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 贝塞尔曲线
+class Model extends BezierEdgeModel {
+ constructor(data, graphModel) {
+ super(data, graphModel)
+ this.strokeWidth = 1
+ }
+ getTextStyle() {
+ const style = super.getTextStyle()
+ return getTextStyleFunction(style, this.properties)
+ }
+
+ getEdgeStyle() {
+ const attributes = super.getEdgeStyle()
+ const properties = this.properties
+ const style = getShapeStyleFuction(attributes, properties)
+ return { ...style, fill: 'none' }
+ }
+}
+export default {
+ type: 'pro-bezier',
+ view: BezierEdge,
+ model: Model
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Line.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Line.js
new file mode 100644
index 0000000..c5ef06e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Line.js
@@ -0,0 +1,26 @@
+import { LineEdge, LineEdgeModel } from '@logicflow/core'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 直线
+class Model extends LineEdgeModel {
+ constructor(data, graphModel) {
+ super(data, graphModel)
+ this.strokeWidth = 1
+ }
+ getTextStyle() {
+ const style = super.getTextStyle()
+ return getTextStyleFunction(style, this.properties)
+ }
+
+ getEdgeStyle() {
+ const attributes = super.getEdgeStyle()
+ const properties = this.properties
+ const style = getShapeStyleFuction(attributes, properties)
+ return { ...style, fill: 'none' }
+ }
+}
+export default {
+ type: 'pro-line',
+ view: LineEdge,
+ model: Model
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Polyline.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Polyline.js
new file mode 100644
index 0000000..86d53c2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/edge/Polyline.js
@@ -0,0 +1,26 @@
+import { PolylineEdge, PolylineEdgeModel } from '@logicflow/core'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 折线
+class Model extends PolylineEdgeModel {
+ constructor(data, graphModel) {
+ super(data, graphModel)
+ this.strokeWidth = 1
+ }
+ getTextStyle() {
+ const style = super.getTextStyle()
+ return getTextStyleFunction(style, this.properties)
+ }
+
+ getEdgeStyle() {
+ const attributes = super.getEdgeStyle()
+ const properties = this.properties
+ const style = getShapeStyleFuction(attributes, properties)
+ return { ...style, fill: 'none' }
+ }
+}
+export default {
+ type: 'pro-polyline',
+ view: PolylineEdge,
+ model: Model
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/getShapeStyleUtil.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/getShapeStyleUtil.js
new file mode 100644
index 0000000..ccea7dd
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/getShapeStyleUtil.js
@@ -0,0 +1,70 @@
+export const getShapeStyleFuction = (style, properties) => {
+ if (properties.backgroundColor) {
+ style.fill = properties.backgroundColor
+ }
+ if (properties.transform) { // 旋转
+ style.transform = properties.transform
+ }
+ if (properties.imageWidth) { // 宽度
+ style.imageWidth = properties.imageWidth
+ }
+ if (properties.imageHeight) { // 高度
+ style.imageHeight = properties.imageHeight
+ }
+ if (properties.gradientColor && style.fill !== properties.gradientColor) {
+ style.fillGradient = properties.gradientColor
+ }
+ if (properties.borderColor) {
+ style.stroke = properties.borderColor
+ }
+ if (properties.borderWidth) {
+ style.strokeWidth = properties.borderWidth
+ }
+ if (properties.borderStyle) {
+ if (properties.borderStyle === 'solid') {
+ style.strokeDashArray = '0'
+ // nodeResize里的bug导致的,array小写了
+ style.strokeDasharray = '0'
+ }
+ if (properties.borderStyle === 'dashed') {
+ style.strokeDashArray = '3 3'
+ style.strokeDasharray = '3 3'
+ }
+ if (properties.borderStyle === 'dotted') {
+ style.strokeDashArray = '1 1'
+ style.strokeDasharray = '1 1'
+ }
+ if (properties.borderStyle === 'hidden') {
+ style.stroke = style.fill
+ }
+ }
+ return style
+}
+
+export const getTextStyleFunction = (style = {}, properties) => {
+ if (properties.fontColor) {
+ style.color = properties.fontColor
+ }
+ if (properties.fontSize) {
+ style.fontSize = properties.fontSize
+ }
+ if (properties.fontFamily) {
+ style.fontFamily = properties.fontFamily
+ }
+ if (properties.lineHeight) {
+ style.lineHeight = properties.lineHeight
+ }
+ if (properties.textAlign) {
+ style.textAlign = properties.textAlign
+ }
+ if (properties.fontWeight) {
+ style.fontWeight = properties.fontWeight
+ }
+ if (properties.textDecoration) {
+ style.textDecoration = properties.textDecoration
+ }
+ if (properties.fontStyle) {
+ style.fontStyle = properties.fontStyle
+ }
+ return style
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/html/htmlNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/html/htmlNode.js
new file mode 100644
index 0000000..ea118f4
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/html/htmlNode.js
@@ -0,0 +1,89 @@
+import { HtmlResize } from '@logicflow/extension'
+import defaultUrl from '../../../image/agv.svg'
+import api from '@/store/modules/api'
+import tray from '../../../image/托盘.svg'
+import icon_alert from '../../../image/icon_alert.png'
+class ButtonNodeModel extends HtmlResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 34
+ this.height = 34
+ this.text.draggable = true
+ this.text.editable = false
+ }
+}
+
+class ButtonNode extends HtmlResize.view {
+ setHtml(rootEl) {
+ /**
+ * 自己设置的宽高在 imageHeight/imageWidth
+ * 用拖动设置的宽高在 properties.nodeSize.height/properties.nodeSize.width
+ */
+ const oldNode = this.props.model
+ const properties = oldNode.getProperties()
+ // console.log(properties)
+ // console.log('oldNode', oldNode)
+ // 路径前缀
+ const baseUrl = api.state.baseApi
+ // 颜色
+ let statusColor = '#FF4500'
+ // 默认图片
+ // let imageUrl = baseUrl + '/file/图片/专机-20220722094234555.png'
+ let imageUrl = defaultUrl
+ // 托盘图片
+ const goods = tray
+ const trayHeight = Math.round(2 / 3 * oldNode._height)
+ const trayWidth = Math.round(2 / 3 * oldNode._width)
+ let trayDisplay = 'none'
+ // 故障图片
+ const fault = icon_alert
+ let faultDisplay = 'none'
+ if (properties.imageUrl) { // 与图片尾部拼接
+ imageUrl = baseUrl + '/file/图片/' + properties.imageUrl
+ }
+ if (!properties.transform) { // 如果没有值,设置默认为0度
+ properties.transform = 0
+ }
+ if (properties.isOnline) {
+ statusColor = '#54dc5f'
+ }
+ if (!properties.device) {
+ statusColor = 'rgba(255,255,255,0)'
+ }
+ if (properties.hasGoods) {
+ // 显示图片,并设置宽高
+ trayDisplay = 'flex'
+ }
+ if (properties.isError) {
+ // 显示图片,并设置宽高
+ faultDisplay = 'flex'
+ }
+ if (properties.isLock !== undefined) {
+ oldNode.draggable = !properties.isLock
+ }
+ const el = document.createElement('div')
+ el.className = 'uml-wrapper'
+ // el.id = 'uml-app'
+ const html = `
+
+ `
+ el.innerHTML = html
+ rootEl.innerHTML = ''
+ rootEl.appendChild(el)
+ window.setData = () => {
+ const { graphModel, model } = this.props
+ graphModel.eventCenter.emit('custom:button-click', model)
+ }
+ }
+}
+
+export default {
+ type: 'html-node',
+ view: ButtonNode,
+ model: ButtonNodeModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/index.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/index.js
new file mode 100644
index 0000000..ec1544a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/index.js
@@ -0,0 +1,74 @@
+// 导入组件并且注册
+// 基础图形
+import CircleNode from './basic/CircleNode'
+import RectNode from './basic/RectNode'
+import RectRadiusNode from './basic/RectRadiusNode'
+import EllipseNode from './basic/EllipseNode'
+import TextNode from './basic/TextNode'
+import DiamondNode from './basic/DiamondNode'
+// path绘制的个性化图形
+import CylindeNode from './path/CylindeNode'
+import TriangleNode from './path/TriangleNode'
+import ParallelogramNode from './path/ParallelogramNode'
+import ActorNode from './path/ActorNode'
+import StarNode from './path/Star'
+import PentagonNode from './path/PentagonNode'
+import HexagonNode from './path/HexagonNode'
+import SeptagonNode from './path/SeptagonNode'
+import HeptagonNode from './path/HeptagonNode'
+import TrapezoidNode from './path/TrapezoidNode'
+import CrossNode from './path/CrossNode'
+import MinusNode from './path/MinusNode'
+import TimesNode from './path/TimesNode'
+import DivideNode from './path/DivideNode'
+// 多边形绘制的箭头
+import LeftArrow from './arrow/LeftArrow'
+import RightArrow from './arrow/RightArrow'
+import HorizontalArrow from './arrow/HorizontalArrowNode'
+import UpArrow from './arrow/UpArrowNode'
+import DownArrow from './arrow/DownArrowNode'
+import VerticalArrow from './arrow/VerticalArrowNode'
+// 注册边
+import Ployline from './edge/Polyline'
+import Line from './edge/Line'
+import Bezier from './edge/Bezier'
+// html图片
+import HtmlNode from './html/htmlNode'
+
+export const registerCustomElement = (lf) => {
+ // 注册基础图形
+ lf.register(CircleNode)
+ lf.register(RectNode)
+ lf.register(RectRadiusNode)
+ lf.register(EllipseNode)
+ lf.register(DiamondNode)
+ lf.register(TextNode)
+ // 注册path绘制的个性化图形
+ lf.register(CylindeNode)
+ lf.register(TriangleNode)
+ lf.register(ParallelogramNode)
+ lf.register(ActorNode)
+ lf.register(StarNode)
+ lf.register(PentagonNode)
+ lf.register(HexagonNode)
+ lf.register(SeptagonNode)
+ lf.register(HeptagonNode)
+ lf.register(TrapezoidNode)
+ lf.register(CrossNode)
+ lf.register(MinusNode)
+ lf.register(TimesNode)
+ lf.register(DivideNode)
+ // 注册多边形绘制的箭头
+ lf.register(LeftArrow)
+ lf.register(RightArrow)
+ lf.register(HorizontalArrow)
+ lf.register(UpArrow)
+ lf.register(DownArrow)
+ lf.register(VerticalArrow)
+ // 注册边
+ lf.register(Ployline)
+ lf.register(Line)
+ lf.register(Bezier)
+ // 注册html结点
+ lf.register(HtmlNode)
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/ActorNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/ActorNode.js
new file mode 100644
index 0000000..718e511
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/ActorNode.js
@@ -0,0 +1,95 @@
+import { h } from '@logicflow/core'
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+// 人物
+class ActorModel extends RectResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 40
+ this.height = 80
+ }
+
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class ActorView extends RectResize.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ // 人物头部圆形
+ const ellipseAttrs = {
+ ...style,
+ cx: x,
+ cy: y - 3 / 8 * height,
+ rx: 1 / 4 * width,
+ ry: 1 / 8 * height,
+ width,
+ height
+ }
+ // 人物肩膀横线
+ const pathAAttrs = {
+ ...style,
+ d: `M ${x - 1 / 2 * width} ${y - 1 / 8 * height} L ${x + 1 / 2 * width} ${y - 1 / 8 * height}`
+ }
+ // 人物身体躯干竖线
+ const pathBAttrs = {
+ ...style,
+ d: `M ${x} ${y - 1 / 4 * height} L ${x} ${y + 1 / 5 * height}`
+ }
+ // 人物左腿斜线
+ const pathCAttrs = {
+ ...style,
+ d: `M ${x} ${y + 1 / 5 * height} L ${x - 1 / 2 * width} ${y + 1 / 2 * height}`
+ }
+ // 人物右腿斜线
+ const pathDAttrs = {
+ ...style,
+ d: `M ${x} ${y + 1 / 5 * height} L ${x + 1 / 2 * width} ${y + 1 / 2 * height}`
+ }
+ // 人物透明背景板
+ const bgAttrs = {
+ x: x - 1 / 5 * width,
+ y: y - 1 / 2 * height,
+ width: 2 / 5 * width,
+ height,
+ style: 'fill: transparent'
+ }
+ return h('g', {}, [
+ h('ellipse', {
+ ...ellipseAttrs
+ }),
+ h('path', {
+ ...pathAAttrs
+ }),
+ h('path', {
+ ...pathBAttrs
+ }),
+ h('path', {
+ ...pathCAttrs
+ }),
+ h('path', {
+ ...pathDAttrs
+ }),
+ h('rect', {
+ ...bgAttrs
+ })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'actor',
+ view: ActorView,
+ model: ActorModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/CrossNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/CrossNode.js
new file mode 100644
index 0000000..a9b4bbc
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/CrossNode.js
@@ -0,0 +1,65 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 加号
+class CrossModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class CrossView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 1 / 2 * width, y - 1 / 6 * height],
+ [x - 1 / 6 * width, y - 1 / 6 * height],
+ [x - 1 / 6 * width, y - 1 / 2 * height],
+ [x + 1 / 6 * width, y - 1 / 2 * height],
+ [x + 1 / 6 * width, y - 1 / 6 * height],
+ [x + 1 / 2 * width, y - 1 / 6 * height],
+ [x + 1 / 2 * width, y + 1 / 6 * height],
+ [x + 1 / 6 * width, y + 1 / 6 * height],
+ [x + 1 / 6 * width, y + 1 / 2 * height],
+ [x - 1 / 6 * width, y + 1 / 2 * height],
+ [x - 1 / 6 * width, y + 1 / 6 * height],
+ [x - 1 / 2 * width, y + 1 / 6 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'cross',
+ view: CrossView,
+ model: CrossModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/CylindeNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/CylindeNode.js
new file mode 100644
index 0000000..a719c7e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/CylindeNode.js
@@ -0,0 +1,92 @@
+import { h } from '@logicflow/core'
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 圆柱体
+class CylindeModel extends RectResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 60
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class CylindeView extends RectResize.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ // 圆柱体顶部椭圆
+ const ellipseAAttrs = {
+ ...style,
+ cx: x,
+ cy: y - 1 / 3 * height,
+ rx: 1 / 2 * width,
+ ry: 1 / 6 * height,
+ width,
+ height
+ }
+ // 圆柱体左直线
+ const pathAAttrs = {
+ ...style,
+ d: `M ${x - 1 / 2 * width} ${y - 1 / 3 * height} L ${x - 1 / 2 * width} ${y + 1 / 3 * height}`
+ }
+ // 圆柱体右直线
+ const pathBAttrs = {
+ ...style,
+ d: `M ${x + 1 / 2 * width} ${y - 1 / 3 * height} L ${x + 1 / 2 * width} ${y + 1 / 3 * height}`
+ }
+ // 圆柱体下椭圆
+ const ellipseBAttrs = {
+ ...style,
+ cx: x,
+ cy: y + 1 / 3 * height,
+ rx: 1 / 2 * width,
+ ry: 1 / 6 * height,
+ width,
+ height
+ }
+ // 圆柱体中间填充部分
+ const rectAttrs = {
+ ...style,
+ x: x - 1 / 2 * width,
+ y: y - 1 / 3 * height,
+ width,
+ height: 2 / 3 * height,
+ stroke: 'transparent'
+ }
+ return h('g', {}, [
+ h('ellipse', {
+ ...ellipseBAttrs
+ }),
+ h('rect', {
+ ...rectAttrs
+ }),
+ h('path', {
+ ...pathAAttrs
+ }),
+ h('path', {
+ ...pathBAttrs
+ }),
+ h('ellipse', {
+ ...ellipseAAttrs
+ })
+ ])
+ }
+}
+
+export default {
+ type: 'cylinde',
+ model: CylindeModel,
+ view: CylindeView
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/DivideNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/DivideNode.js
new file mode 100644
index 0000000..1fa2d98
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/DivideNode.js
@@ -0,0 +1,83 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 除号
+class DivideModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class DivideView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 1 / 2 * width, y - 1 / 8 * height],
+ [x + 1 / 2 * width, y - 1 / 8 * height],
+ [x + 1 / 2 * width, y + 1 / 8 * height],
+ [x - 1 / 2 * width, y + 1 / 8 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height
+ }
+
+ // 除号中间横线
+ const lineAttrs = {
+ ...attrs,
+ points: points.join(' ')
+ }
+
+ // 除号上圆点
+ const upEllipseAttrs = {
+ ...attrs,
+ cy: y - 3 / 8 * height,
+ cx: x,
+ rx: 1 / 8 * width,
+ ry: 1 / 8 * height
+ }
+
+ // 除号下圆点
+ const downEllipseAttrs = {
+ ...attrs,
+ cy: y + 3 / 8 * height,
+ cx: x,
+ rx: 1 / 8 * width,
+ ry: 1 / 8 * height
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...lineAttrs }),
+ h('ellipse', { ...upEllipseAttrs }),
+ h('ellipse', { ...downEllipseAttrs })
+ ])
+ }
+}
+
+export default {
+ type: 'divide',
+ view: DivideView,
+ model: DivideModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/HeptagonNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/HeptagonNode.js
new file mode 100644
index 0000000..b28d42b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/HeptagonNode.js
@@ -0,0 +1,61 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 五边形
+class HeptagonModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class HeptagonView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 0.205 * width, y - 0.5 * height],
+ [x + 0.205 * width, y - 0.5 * height],
+ [x + 0.5 * width, y - 0.205 * height],
+ [x + 0.5 * width, y + 0.205 * height],
+ [x + 0.205 * width, y + 0.5 * height],
+ [x - 0.205 * width, y + 0.5 * height],
+ [x - 0.5 * width, y + 0.205 * height],
+ [x - 0.5 * width, y - 0.205 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'heptagon',
+ view: HeptagonView,
+ model: HeptagonModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/HexagonNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/HexagonNode.js
new file mode 100644
index 0000000..a0e281f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/HexagonNode.js
@@ -0,0 +1,59 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 六边形
+class HexagonModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class HexagonView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 0.28 * width, y - 0.5 * height],
+ [x + 0.28 * width, y - 0.5 * height],
+ [x + 0.5 * width, y],
+ [x + 0.28 * width, y + 0.5 * height],
+ [x - 0.28 * width, y + 0.5 * height],
+ [x - 0.5 * width, y]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'hexagon',
+ view: HexagonView,
+ model: HexagonModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/MinusNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/MinusNode.js
new file mode 100644
index 0000000..5f29f1e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/MinusNode.js
@@ -0,0 +1,57 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 减号
+class MinusModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 20
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class MinusView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 1 / 2 * width, y - 1 / 2 * height],
+ [x + 1 / 2 * width, y - 1 / 2 * height],
+ [x + 1 / 2 * width, y + 1 / 2 * height],
+ [x - 1 / 2 * width, y + 1 / 2 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'minus',
+ view: MinusView,
+ model: MinusModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/ParallelogramNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/ParallelogramNode.js
new file mode 100644
index 0000000..96b07f8
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/ParallelogramNode.js
@@ -0,0 +1,57 @@
+import { h } from '@logicflow/core'
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 平行四边形
+class ParallelogramModel extends RectResize.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 100
+ this.height = 60
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class ParallelogramView extends RectResize.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - width / 2, y + height / 2],
+ [x - width / 5, y - height / 2],
+ [x + width / 2, y - height / 2],
+ [x + width / 5, y + height / 2]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'parallelogram',
+ view: ParallelogramView,
+ model: ParallelogramModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/PentagonNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/PentagonNode.js
new file mode 100644
index 0000000..0bf20aa
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/PentagonNode.js
@@ -0,0 +1,58 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 八边形
+class PentagonModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class PentagonView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 0.5 * width, y],
+ [x, y - 0.5 * height],
+ [x + 0.5 * width, y],
+ [x + 0.3 * width, y + 0.5 * height],
+ [x - 0.3 * width, y + 0.5 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'pentagon',
+ view: PentagonView,
+ model: PentagonModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/SeptagonNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/SeptagonNode.js
new file mode 100644
index 0000000..9ea030a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/SeptagonNode.js
@@ -0,0 +1,60 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 七边形
+class SeptagonModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class SeptagonView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x, y - 0.5 * height],
+ [x + 0.395 * width, y - 0.3 * height],
+ [x + 0.5 * width, y + 0.145 * height],
+ [x + 0.225 * width, y + 0.5 * height],
+ [x - 0.225 * width, y + 0.5 * height],
+ [x - 0.5 * width, y + 0.145 * height],
+ [x - 0.395 * width, y - 0.3 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'septagon',
+ view: SeptagonView,
+ model: SeptagonModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/Star.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/Star.js
new file mode 100644
index 0000000..28eaede
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/Star.js
@@ -0,0 +1,40 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+
+// 五角星
+class StarModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+}
+
+class StarView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const svgAttr = {
+ x: x - 1 / 2 * width,
+ y: y - 1 / 2 * height,
+ width,
+ height
+ }
+ const pathAAttrs = {
+ ...style,
+ d: 'm0.36922,13.46587l12.98695,0l4.01307,-13.36885l4.01307,13.36885l12.98694,0l-10.50664,8.26231l4.01327,13.36885l-10.50665,-8.26253l-10.50664,8.26253l4.01327,-13.36885l-10.50665,-8.26231l0,0z'
+ }
+
+ return h('svg', { ...svgAttr, viewBox: '0 0 37 37' }, [
+ h('path', {
+ ...pathAAttrs
+ })
+ ])
+ }
+}
+
+export default {
+ type: 'star',
+ view: StarView,
+ model: StarModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TimesNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TimesNode.js
new file mode 100644
index 0000000..6d67a2f
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TimesNode.js
@@ -0,0 +1,65 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 乘号
+class TimesModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class TimesView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 1 / 2 * width, y - 1 / 3 * height],
+ [x - 1 / 3 * width, y - 1 / 2 * height],
+ [x, y - 1 / 6 * height],
+ [x + 1 / 3 * width, y - 1 / 2 * height],
+ [x + 1 / 2 * width, y - 1 / 3 * height],
+ [x + 1 / 6 * width, y],
+ [x + 1 / 2 * width, y + 1 / 3 * height],
+ [x + 1 / 3 * width, y + 1 / 2 * height],
+ [x, y + 1 / 6 * height],
+ [x - 1 / 3 * width, y + 1 / 2 * height],
+ [x - 1 / 2 * width, y + 1 / 3 * height],
+ [x - 1 / 6 * width, y]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'times',
+ view: TimesView,
+ model: TimesModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TrapezoidNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TrapezoidNode.js
new file mode 100644
index 0000000..3ffe197
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TrapezoidNode.js
@@ -0,0 +1,57 @@
+import { h } from '@logicflow/core'
+import RectNode from '../basic/RectNode'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 五边形
+class TrapezoidModel extends RectNode.model {
+ initNodeData(data) {
+ super.initNodeData(data)
+ this.width = 80
+ this.height = 80
+ }
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class TrapezoidView extends RectNode.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const pointList = [
+ [x - 0.31 * width, y - 0.5 * height],
+ [x + 0.31 * width, y - 0.5 * height],
+ [x + 0.5 * width, y + 0.5 * height],
+ [x - 0.5 * width, y + 0.5 * height]
+ ]
+ const points = pointList.map(item => {
+ return `${item[0]},${item[1]}`
+ })
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: points.join(' ')
+ }
+
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ])
+ }
+}
+
+export default {
+ type: 'trapezoid',
+ view: TrapezoidView,
+ model: TrapezoidModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TriangleNode.js b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TriangleNode.js
new file mode 100644
index 0000000..67ff9e3
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/node/path/TriangleNode.js
@@ -0,0 +1,47 @@
+import { h } from '@logicflow/core'
+import { RectResize } from '@logicflow/extension'
+import { getShapeStyleFuction, getTextStyleFunction } from '../getShapeStyleUtil'
+
+// 三角形
+class TriangleModel extends RectResize.model {
+ getNodeStyle() {
+ const style = super.getNodeStyle()
+ const properties = this.getProperties()
+ return getShapeStyleFuction(style, properties)
+ }
+
+ getTextStyle() {
+ const style = super.getTextStyle()
+ const properties = this.getProperties()
+ return getTextStyleFunction(style, properties)
+ }
+}
+
+class TriangleView extends RectResize.view {
+ getResizeShape() {
+ const { x, y, width, height } = this.props.model
+ const style = this.props.model.getNodeStyle()
+ const attrs = {
+ ...style,
+ x,
+ y,
+ width,
+ height,
+ points: [
+ [x - width / 2, y + height / 2],
+ [x - width / 2, y - height / 2],
+ [x + width / 2, y]
+ ]
+ }
+ return h('g', {}, [
+ h('polygon', { ...attrs })
+ ]
+ )
+ }
+}
+
+export default {
+ type: 'triangle',
+ view: TriangleView,
+ model: TriangleModel
+}
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/constant/index.js b/acs/nladmin-ui/src/views/system/logicflow/editor/constant/index.js
new file mode 100644
index 0000000..710a725
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/constant/index.js
@@ -0,0 +1,69 @@
+export const shortStyles = [
+ {
+ backgroundColor: 'rgb(255, 255, 255)',
+ borderWidth: '1px',
+ borderColor: 'rgb(42, 42, 42)'
+ },
+ {
+ backgroundColor: 'rgb(245, 245, 245)',
+ borderWidth: '1px',
+ borderColor: 'rgb(102, 102, 102)'
+ },
+ {
+ backgroundColor: 'rgb(218, 232, 252)',
+ borderWidth: '1px',
+ borderColor: 'rgb(108, 142, 191)'
+ },
+ {
+ backgroundColor: 'rgb(213, 232, 212)',
+ borderWidth: '1px',
+ borderColor: 'rgb(130, 179, 102)'
+ },
+ {
+ backgroundColor: 'rgb(255, 230, 204)',
+ borderWidth: '1px',
+ borderColor: 'rgb(215, 155, 0)'
+ },
+ {
+ backgroundColor: 'rgb(255, 242, 204)',
+ borderWidth: '1px',
+ borderColor: 'rgb(214, 182, 86)'
+ },
+ {
+ backgroundColor: 'rgb(248, 206, 204)',
+ borderWidth: '1px',
+ borderColor: 'rgb(184, 84, 80)'
+ },
+ {
+ backgroundColor: 'rgb(220, 210, 230)',
+ borderWidth: '1px',
+ borderColor: 'rgb(150, 115, 166)'
+ }
+]
+
+export const borderStyles = [
+ {
+ value: 'solid'
+ },
+ {
+ value: 'dashed'
+ },
+ {
+ value: 'dotted'
+ }
+]
+
+export const fontFamilies = [
+ {
+ value: 'Arial'
+ },
+ {
+ value: 'Verdana'
+ },
+ {
+ value: 'Georgia'
+ },
+ {
+ value: 'Times New Roman'
+ }
+]
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/image/agv.svg b/acs/nladmin-ui/src/views/system/logicflow/editor/image/agv.svg
new file mode 100644
index 0000000..d7a91d4
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/image/agv.svg
@@ -0,0 +1,60 @@
+
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/image/icon_alert.png b/acs/nladmin-ui/src/views/system/logicflow/editor/image/icon_alert.png
new file mode 100644
index 0000000..c224792
Binary files /dev/null and b/acs/nladmin-ui/src/views/system/logicflow/editor/image/icon_alert.png differ
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/image/托盘.svg b/acs/nladmin-ui/src/views/system/logicflow/editor/image/托盘.svg
new file mode 100644
index 0000000..552024a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/image/托盘.svg
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/index.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/index.vue
new file mode 100644
index 0000000..4b0e213
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/image/index.vue b/acs/nladmin-ui/src/views/system/logicflow/image/index.vue
new file mode 100644
index 0000000..6c1eb64
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/image/index.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/logicflow/index.vue b/acs/nladmin-ui/src/views/system/logicflow/index.vue
new file mode 100644
index 0000000..90c77e1
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/logicflow/index.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/menu/index.vue b/acs/nladmin-ui/src/views/system/menu/index.vue
new file mode 100644
index 0000000..f88c5c2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/menu/index.vue
@@ -0,0 +1,267 @@
+
+
+
+
+
+
+
+
+
+ 目录
+ 菜单
+ 按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+ 是
+ 否
+
+
+
+
+ 是
+ 否
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.menuSort }}
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+ 是
+ 否
+
+
+
+
+ 否
+ 是
+
+
+
+
+ 是
+ 否
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/monitor/device/index.vue b/acs/nladmin-ui/src/views/system/monitor/device/index.vue
new file mode 100644
index 0000000..fc0af8e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/monitor/device/index.vue
@@ -0,0 +1,628 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无货
+ 有托盘
+ 有托盘有货
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 无货
+ 空料斗
+ 满料斗
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 正常
+ 禁用
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/param/index.vue b/acs/nladmin-ui/src/views/system/param/index.vue
new file mode 100644
index 0000000..dddbcab
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/param/index.vue
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/redis/index.vue b/acs/nladmin-ui/src/views/system/redis/index.vue
new file mode 100644
index 0000000..39b2dc2
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/redis/index.vue
@@ -0,0 +1,267 @@
+
+
+
+
+
+
+ 基本信息
+
+
+
+
+
+ Redis版本: |
+ {{ cache.info.redis_version }} |
+ 运行模式: |
+ {{ cache.info.redis_mode == "standalone" ? "单机" : "集群" }} |
+ 端口: |
+ {{ cache.info.tcp_port }} |
+ 客户端数: |
+ {{ cache.info.connected_clients }} |
+
+
+ 运行时间(天): |
+ {{ cache.info.uptime_in_days }} |
+ 使用内存: |
+ {{ cache.info.used_memory_human }} |
+ 使用CPU: |
+ {{ parseFloat(cache.info.used_cpu_user_children).toFixed(2) }} |
+ 内存配置: |
+ {{ cache.info.maxmemory_human }} |
+
+
+ AOF是否开启: |
+ {{ cache.info.aof_enabled === "0" ? "否" : "是" }} |
+ RDB是否成功: |
+ {{ cache.info.rdb_last_bgsave_status }} |
+ Key数量: |
+ {{ cache.dbSize }} |
+ 网络入口/出口: |
+ {{ cache.info.instantaneous_input_kbps }}kps/{{ cache.info.instantaneous_output_kbps }}kps |
+
+
+
+
+
+
+
+
+
+ 命令统计
+
+
+
+
+
+
+
+ 内存信息
+
+
+
+
+
+
+
+ 批量删除
+
+
+
+
+
+
+
+
+
+ 永不过时
+
+
+ 已过期
+
+
+ {{ scope.row.expire }}秒
+
+
+
+
+
+
+ 清除数据
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/role/index.vue b/acs/nladmin-ui/src/views/system/role/index.vue
new file mode 100644
index 0000000..7952854
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/role/index.vue
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 角色列表
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 菜单分配
+
+ 保存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/crontab.vue b/acs/nladmin-ui/src/views/system/timing/components/crontab.vue
new file mode 100644
index 0000000..dee503c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/crontab.vue
@@ -0,0 +1,430 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确定
+ 重置
+ 取消
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/day.vue b/acs/nladmin-ui/src/views/system/timing/components/day.vue
new file mode 100644
index 0000000..265d7ab
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/day.vue
@@ -0,0 +1,161 @@
+
+
+
+
+ 日,允许的通配符[, - * ? / L W]
+
+
+
+
+
+ 不指定
+
+
+
+
+
+ 周期从
+ -
+ 日
+
+
+
+
+
+ 从
+ 号开始,每
+ 日执行一次
+
+
+
+
+
+ 每月
+ 号最近的那个工作日
+
+
+
+
+
+ 本月最后一天
+
+
+
+
+
+ 指定
+
+ {{ item }}
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/hour.vue b/acs/nladmin-ui/src/views/system/timing/components/hour.vue
new file mode 100644
index 0000000..ded91bd
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/hour.vue
@@ -0,0 +1,114 @@
+
+
+
+
+ 小时,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 小时
+
+
+
+
+
+ 从
+ 小时开始,每
+ 小时执行一次
+
+
+
+
+
+ 指定
+
+ {{ item-1 }}
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/min.vue b/acs/nladmin-ui/src/views/system/timing/components/min.vue
new file mode 100644
index 0000000..55219f0
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/min.vue
@@ -0,0 +1,116 @@
+
+
+
+
+ 分钟,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 分钟
+
+
+
+
+
+ 从
+ 分钟开始,每
+ 分钟执行一次
+
+
+
+
+
+ 指定
+
+ {{ item-1 }}
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/month.vue b/acs/nladmin-ui/src/views/system/timing/components/month.vue
new file mode 100644
index 0000000..7f0208b
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/month.vue
@@ -0,0 +1,114 @@
+
+
+
+
+ 月,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 月
+
+
+
+
+
+ 从
+ 月开始,每
+ 月月执行一次
+
+
+
+
+
+ 指定
+
+ {{ item }}
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/result.vue b/acs/nladmin-ui/src/views/system/timing/components/result.vue
new file mode 100644
index 0000000..e4124d9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/result.vue
@@ -0,0 +1,556 @@
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/second.vue b/acs/nladmin-ui/src/views/system/timing/components/second.vue
new file mode 100644
index 0000000..cc3c700
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/second.vue
@@ -0,0 +1,117 @@
+
+
+
+
+ 秒,允许的通配符[, - * /]
+
+
+
+
+
+ 周期从
+ -
+ 秒
+
+
+
+
+
+ 从
+ 秒开始,每
+ 秒执行一次
+
+
+
+
+
+ 指定
+
+ {{ item-1 }}
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/week.vue b/acs/nladmin-ui/src/views/system/timing/components/week.vue
new file mode 100644
index 0000000..6206eb8
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/week.vue
@@ -0,0 +1,202 @@
+
+
+
+
+ 周,允许的通配符[, - * ? / L #]
+
+
+
+
+
+ 不指定
+
+
+
+
+
+ 周期从星期
+
+ {{ item.value }}
+
+ -
+
+ {{ item.value }}
+
+
+
+
+
+
+ 第
+ 周的星期
+
+ {{ item.value }}
+
+
+
+
+
+
+ 本月最后一个星期
+
+ {{ item.value }}
+
+
+
+
+
+
+ 指定
+
+ {{ item.value }}
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/components/year.vue b/acs/nladmin-ui/src/views/system/timing/components/year.vue
new file mode 100644
index 0000000..c667768
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/components/year.vue
@@ -0,0 +1,131 @@
+
+
+
+
+ 不填,允许的通配符[, - * /]
+
+
+
+
+
+ 每年
+
+
+
+
+
+ 周期从
+ -
+
+
+
+
+
+
+ 从
+ 年开始,每
+ 年执行一次
+
+
+
+
+
+
+ 指定
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/index.vue b/acs/nladmin-ui/src/views/system/timing/index.vue
new file mode 100644
index 0000000..ca1474c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/index.vue
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 生成表达式
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+ 否
+
+
+
+
+ 启用
+ 暂停
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.isPause ? '已暂停' : '运行中' }}
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 编辑
+ 执行
+
+ {{ scope.row.isPause ? '恢复' : '暂停' }}
+
+
+ 确定停止并删除该任务吗?
+
+ 取消
+ 确定
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/timing/log.vue b/acs/nladmin-ui/src/views/system/timing/log.vue
new file mode 100644
index 0000000..b5e1f0a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/timing/log.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+
+
+
+
+ 查看详情
+
+
+
+
+
+ {{ scope.row.isSuccess ? '成功' : '失败' }}
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/user/center.vue b/acs/nladmin-ui/src/views/system/user/center.vue
new file mode 100644
index 0000000..029a5dc
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/user/center.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+ 个人信息
+
+
+
+
+
![点击上传头像]()
+
+
+
+
+
+ - 用户姓名
{{ user.nickName }}
+ - 所属部门
{{ user.dept.name }}
+ - 手机号码
{{ user.phone }}
+ - 用户邮箱
{{ user.email }}
+ -
+ 安全设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 用户姓名不作为登录使用
+
+
+
+ 手机号码不能重复
+
+
+
+ 男
+ 女
+
+
+
+ 保存配置
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.time }}ms
+ {{ scope.row.time }}ms
+ {{ scope.row.time }}ms
+
+
+
+
+ 创建日期
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/user/center/updateEmail.vue b/acs/nladmin-ui/src/views/system/user/center/updateEmail.vue
new file mode 100644
index 0000000..d72b63a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/user/center/updateEmail.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/user/center/updatePass.vue b/acs/nladmin-ui/src/views/system/user/center/updatePass.vue
new file mode 100644
index 0000000..c646754
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/user/center/updatePass.vue
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/system/user/index.vue b/acs/nladmin-ui/src/views/system/user/index.vue
new file mode 100644
index 0000000..7f76c66
--- /dev/null
+++ b/acs/nladmin-ui/src/views/system/user/index.vue
@@ -0,0 +1,484 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.dept.name }}
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+
+
+ 重置密码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/tools/codeGen/codeDetail.vue b/acs/nladmin-ui/src/views/tools/codeGen/codeDetail.vue
new file mode 100644
index 0000000..ea3a345
--- /dev/null
+++ b/acs/nladmin-ui/src/views/tools/codeGen/codeDetail.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ query.dictName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/tools/codeGen/index.vue b/acs/nladmin-ui/src/views/tools/codeGen/index.vue
new file mode 100644
index 0000000..6742313
--- /dev/null
+++ b/acs/nladmin-ui/src/views/tools/codeGen/index.vue
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编码详情
+ 新增
+
+
+
+
+
+
+
+
+
+
+
diff --git a/acs/nladmin-ui/src/views/tools/swagger/index.vue b/acs/nladmin-ui/src/views/tools/swagger/index.vue
new file mode 100644
index 0000000..5162cd9
--- /dev/null
+++ b/acs/nladmin-ui/src/views/tools/swagger/index.vue
@@ -0,0 +1,16 @@
+
+
+
+