From 0592de1e8101d7ae1c8a09161084314d5f0bf096 Mon Sep 17 00:00:00 2001 From: xieyonghong <18010623010@163.com> Date: Thu, 23 Feb 2023 09:42:31 +0800 Subject: [PATCH 1/4] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96vuex=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=9D=83=E9=99=90=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/rule-engine/scene.ts | 8 ++ src/store/menu.ts | 25 ++-- src/store/scene.ts | 132 ++++++++++++++++++ .../Scene/Save/components/TriggerWay.vue | 119 ++++++++++++++++ src/views/rule-engine/Scene/Save/index.vue | 34 ++++- src/views/rule-engine/Scene/Save/save.vue | 104 ++++++++++++++ src/views/rule-engine/Scene/index.vue | 33 ++++- 7 files changed, 431 insertions(+), 24 deletions(-) create mode 100644 src/api/rule-engine/scene.ts create mode 100644 src/store/scene.ts create mode 100644 src/views/rule-engine/Scene/Save/components/TriggerWay.vue create mode 100644 src/views/rule-engine/Scene/Save/save.vue diff --git a/src/api/rule-engine/scene.ts b/src/api/rule-engine/scene.ts new file mode 100644 index 00000000..28cd4b71 --- /dev/null +++ b/src/api/rule-engine/scene.ts @@ -0,0 +1,8 @@ +import server from '@/utils/request'; + + +export const modify = (id: string, data: any) => server.put(`/scene/${id}`, data) + +export const save = (data: any) => server.post(`/scene`, data) + +export const detail = (id: string) => server.get(`/scene/${id}`) \ No newline at end of file diff --git a/src/store/menu.ts b/src/store/menu.ts index 6d77d988..44c0d9fe 100644 --- a/src/store/menu.ts +++ b/src/store/menu.ts @@ -2,6 +2,7 @@ import { defineStore } from 'pinia' import { queryOwnThree } from '@/api/system/menu' import { filterAsnycRouter, MenuItem } from '@/utils/menu' import { isArray } from 'lodash-es' +import { usePermissionStore } from './permission' import router from '@/router' const defaultOwnParams = [ @@ -45,26 +46,15 @@ export const useMenuStore = defineStore({ }), getters: { hasPermission(state) { - return (code: string | string[]) => { - if (!code) { + return (menuCode: string | string[]) => { + if (!menuCode) { return true } if (!!Object.keys(state.menus).length) { - let codes: string[] = [] - - if (typeof code === 'string') { - codes.push(code) - } else { - codes = code + if (typeof menuCode === 'string') { + return !!this.menus[menuCode] } - - return codes.some(_c => { - const menu_code = _c.split(':') - if (menu_code.length > 1) { - return !!this.menus[menu_code[0]]?.buttons?.includes(menu_code[1]) - } - return false - }) + return menuCode.some(code => !!this.menus[code]) } return false } @@ -95,6 +85,8 @@ export const useMenuStore = defineStore({ //过滤非集成的菜单 const resp = await queryOwnThree({ paging: false, terms: defaultOwnParams }) if (resp.success) { + const permission = usePermissionStore() + permission.permissions = {} const { menusData, silderMenus } = filterAsnycRouter(resp.result) this.menus = {} const handleMenuItem = (menu: any) => { @@ -104,6 +96,7 @@ export const useMenuStore = defineStore({ path: menuItem.path, buttons: menuItem.meta.buttons } + permission.permissions[menuItem.name] = menuItem.meta.buttons if (menuItem.children && menuItem.children.length) { handleMenuItem(menuItem.children) } diff --git a/src/store/scene.ts b/src/store/scene.ts new file mode 100644 index 00000000..3a57aaa2 --- /dev/null +++ b/src/store/scene.ts @@ -0,0 +1,132 @@ +import { defineStore } from 'pinia' +import type { BranchesType, FormModelType, SceneItem } from '@/views/rule-engine/Scene/typings' +import { detail } from '@/api/rule-engine/scene' +import { cloneDeep, isArray } from 'lodash-es' +import { randomString } from '@/utils/utils' + +type DataType = { + data: FormModelType | any + productCache: any +} + +const assignmentKey = (data: any[]): any[] => { + const onlyKey = ['when', 'then', 'terms', 'actions']; + if (!data) return []; + + return data.map((item: any) => { + if (item) { + item.key = randomString(); + Object.keys(item).some((key) => { + if (onlyKey.includes(key) && isArray(item[key])) { + item[key] = assignmentKey(item[key]); + } + }); + } + return item; + }); +}; + +export const defaultBranches = [ + { + when: [ + { + terms: [ + { + column: undefined, + value: undefined, + termType: undefined, + key: 'params_1', + type: 'and', + }, + ], + type: 'and', + key: 'terms_1', + }, + ], + key: 'branches_1', + shakeLimit: { + enabled: false, + time: 1, + threshold: 1, + alarmFirst: false, + }, + then: [], + }, +]; + +const defaultOptions = { + trigger: {}, + when: [ + { + terms: [ + { + terms: [], + }, + ], + }, + ], +}; + +export const useSceneStore = defineStore({ + id: 'scene', + state: (): DataType => { + return { + data: { + trigger: { type: ''}, + options: defaultOptions, + branches: defaultBranches, + description: '' + }, + productCache: {} + } + }, + actions: { + /** + * 初始化数据 + */ + initData() { + + }, + /** + * 获取详情 + * @param id + */ + async getDetail(id: string) { + const resp = await detail(id) + if (resp.success) { + const result = resp.result as SceneItem + const triggerType = result.triggerType + let branches: any[] = result.branches + + if (!branches) { + branches = cloneDeep(defaultBranches) + if (triggerType === 'device') { + branches.push(null) + } + } else { + const branchesLength = branches.length; + if ( + triggerType === 'device' && + ((branchesLength === 1 && !!branches[0]?.when?.length) || // 有一组数据并且when有值 + (branchesLength > 1 && !branches[branchesLength - 1]?.when?.length)) // 有多组否则数据,并且最后一组when有值 + ) { + branches.push(null); + } + } + + this.data = { + ...result, + trigger: result.trigger || {}, + branches: cloneDeep(assignmentKey(branches)), + options: {...defaultOptions, ...result.options }, + } + } + }, + getProduct() { + + } + }, + getters: { + + } +}) \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/TriggerWay.vue b/src/views/rule-engine/Scene/Save/components/TriggerWay.vue new file mode 100644 index 00000000..51d4aa5f --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/TriggerWay.vue @@ -0,0 +1,119 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/index.vue b/src/views/rule-engine/Scene/Save/index.vue index 593b1d44..9d91153f 100644 --- a/src/views/rule-engine/Scene/Save/index.vue +++ b/src/views/rule-engine/Scene/Save/index.vue @@ -1,13 +1,35 @@ - - \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/save.vue b/src/views/rule-engine/Scene/Save/save.vue new file mode 100644 index 00000000..ffb36c4f --- /dev/null +++ b/src/views/rule-engine/Scene/Save/save.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/index.vue b/src/views/rule-engine/Scene/index.vue index 71ae1f6c..e317f0ce 100644 --- a/src/views/rule-engine/Scene/index.vue +++ b/src/views/rule-engine/Scene/index.vue @@ -5,13 +5,24 @@ /> + > + + + diff --git a/src/views/notice/Template/index.vue b/src/views/notice/Template/index.vue index 4edb02b8..36f24c9f 100644 --- a/src/views/notice/Template/index.vue +++ b/src/views/notice/Template/index.vue @@ -51,6 +51,7 @@ :src=" getLogo(slotProps.type, slotProps.provider) " + class="logo" /> @@ -388,3 +389,10 @@ const getActions = ( return actions; }; + + From a805bfe5f7aee67e6e23d0d28c8855bd18c6c74e Mon Sep 17 00:00:00 2001 From: xieyonghong <18010623010@163.com> Date: Thu, 23 Feb 2023 10:18:32 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EEllipsis=E7=BB=84?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Ellipsis/index.vue | 168 +++++++++++++++++++++ src/components/index.ts | 2 + src/views/rule-engine/Scene/Save/asstes.ts | 14 ++ src/views/rule-engine/Scene/Save/index.vue | 29 +++- src/views/rule-engine/Scene/typings.ts | 6 + 5 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 src/components/Ellipsis/index.vue create mode 100644 src/views/rule-engine/Scene/Save/asstes.ts diff --git a/src/components/Ellipsis/index.vue b/src/components/Ellipsis/index.vue new file mode 100644 index 00000000..b2e91c49 --- /dev/null +++ b/src/components/Ellipsis/index.vue @@ -0,0 +1,168 @@ + + + + \ No newline at end of file diff --git a/src/components/index.ts b/src/components/index.ts index 49f9d91d..2c47f28a 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -10,6 +10,7 @@ import NormalUpload from './NormalUpload/index.vue' import FileFormat from './FileFormat/index.vue' import JUpload from './JUpload/index.vue' import { BasicLayoutPage, BlankLayoutPage, PageContainer } from './Layout' +import Ellipsis from './Ellipsis/index.vue' export default { install(app: App) { @@ -26,5 +27,6 @@ export default { .component('BasicLayoutPage', BasicLayoutPage) .component('BlankLayoutPage', BlankLayoutPage) .component('PageContainer', PageContainer) + .component('Ellipsis', Ellipsis) } } diff --git a/src/views/rule-engine/Scene/Save/asstes.ts b/src/views/rule-engine/Scene/Save/asstes.ts new file mode 100644 index 00000000..6c42b67a --- /dev/null +++ b/src/views/rule-engine/Scene/Save/asstes.ts @@ -0,0 +1,14 @@ +import { getImage } from '@/utils/comm' + +export const TriggerHeaderIcon = { + time: getImage('/scene/trigger-type-icon/timing.png'), + manual: getImage('/scene/trigger-type-icon/manual.png'), + device: getImage('/scene/trigger-type-icon/device.png') +} + +export const TriggerListIcon = { + time: getImage('/scene/scene-timer.png'), + manual: getImage('/scene/scene-hand.png'), + device: getImage('/scene/scene-device.png') +} + diff --git a/src/views/rule-engine/Scene/Save/index.vue b/src/views/rule-engine/Scene/Save/index.vue index 9d91153f..61e300f5 100644 --- a/src/views/rule-engine/Scene/Save/index.vue +++ b/src/views/rule-engine/Scene/Save/index.vue @@ -1,7 +1,13 @@