feat: 按钮鉴权

This commit is contained in:
leiqiaochu 2023-03-07 10:13:41 +08:00
parent 70a28bcbe1
commit 356bf1fccf
12 changed files with 158 additions and 88 deletions

View File

@ -4,11 +4,12 @@
<div v-if="productStore.current.accessId === undefined || null">
<a-empty :image="simpleImage">
<template #description>
<span>
<span v-if="permissionStore.hasPermission('device/Product:update')">
请先<a-button type="link" @click="showModal"
>选择</a-button
>设备接入网关用以提供设备接入能力
</span>
<span v-else>暂无权限请联系管理员</span>
</template>
</a-empty>
</div>
@ -173,9 +174,7 @@
</a-select>
</a-form-item>
</a-form>
<a-button type="primary" @click="submitDevice"
>保存</a-button
>
<PermissionButton type="primary" @click="submitDevice" hasPermission="device/Instance:update">保存</PermissionButton>
</a-col>
<a-col
:span="12"
@ -271,16 +270,11 @@
target="deviceModal"
@search="search"
/>
<JTable
<JProTable
:columns="columns"
:request="queryList"
ref="tableRef"
modal="card"
:rowSelection="{
selectedRowKeys: _selectedRowKeys,
onChange: onSelectChange,
type: 'radio',
}"
:defaultParams="{
...temp,
sorts: [
@ -343,7 +337,7 @@
<template #id="slotProps">
<a>{{ slotProps.id }}</a>
</template>
</JTable>
</JProTable>
</a-modal>
</template>
@ -353,6 +347,7 @@ import { ConfigMetadata } from '@/views/device/Product/typings';
import { Empty, message } from 'ant-design-vue';
import { getImage } from '@/utils/comm';
import Title from '../Title/index.vue';
import { usePermissionStore } from '@/store/permission';
import './index.less';
import {
getProviders,
@ -375,6 +370,7 @@ import Driver from 'driver.js';
import 'driver.js/dist/driver.min.css';
import { marked } from 'marked';
import type { FormInstance, TableColumnType } from 'ant-design-vue';
const permissionStore = usePermissionStore();
const render = new marked.Renderer();
marked.setOptions({
renderer: render,
@ -548,10 +544,6 @@ const temp = {
const _selectedRowKeys = ref<string[]>([]);
const currentForm = ref({});
const onSelectChange = (keys: string[]) => {
_selectedRowKeys.value = [...keys];
};
const cancelSelect = () => {
_selectedRowKeys.value = [];
};

View File

@ -15,19 +15,26 @@
:params="params"
>
<template #headerTitle>
<a-space>
<a-button type="primary" @click="add"
><plus-outlined />新增</a-button
<j-space>
<PermissionButton
type="primary"
@click="add"
hasPermission="device/Product:add"
>
<template #icon><AIcon type="PlusOutlined" /></template>
新增
</PermissionButton>
<a-upload
name="file"
accept=".json"
:showUploadList="false"
:before-upload="beforeUpload"
>
<a-button>导入</a-button>
<PermissionButton hasPermission="device/Product:import"
>导入</PermissionButton
>
</a-upload>
</a-space>
</j-space>
</template>
<template #deviceType="slotProps">
<div>{{ slotProps.deviceType.text }}</div>
@ -130,6 +137,7 @@
...item.tooltip,
}"
@click="item.onClick"
:hasPermission="'device/Product:' + item.key"
>
<AIcon
type="DeleteOutlined"
@ -193,6 +201,7 @@
<PermissionButton
:disabled="i.disabled"
:popConfirm="i.popConfirm"
:hasPermission="'device/Product:' + i.key"
:tooltip="{
...i.tooltip,
}"
@ -334,12 +343,11 @@ const getActions = (
},
},
{
key: 'edit',
key: 'update',
text: '编辑',
tooltip: {
title: '编辑',
},
icon: 'EditOutlined',
onClick: () => {
title.value = '编辑';
@ -350,7 +358,7 @@ const getActions = (
},
},
{
key: 'download',
key: 'export',
text: '导出',
tooltip: {
title: '导出',

View File

@ -21,15 +21,16 @@
"
/>
</a-tooltip>
<div
style="
margin: 0 0px 0 4px;
color: #1d39c4;
cursor: pointer;
"
<PermissionButton
type="link"
@click="showOutput"
hasPermission="device/Instance:update"
>
<edit-outlined @click="showOutput"/>
</div>
<template #icon
><AIcon type="EditOutlined"
/></template>
</PermissionButton>
</div>
</template>
<a-descriptions
@ -82,15 +83,14 @@
"
/>
</a-tooltip>
<div
style="
margin: 0 0px 0 4px;
color: #1d39c4;
cursor: pointer;
"
<PermissionButton
type="link"
@click="showInput"
hasPermission="device/Instance:update"
>
<edit-outlined @click="showInput"/>
</div>
<template #icon
><AIcon type="EditOutlined" /></template
></PermissionButton>
</div>
</template>
<a-descriptions
@ -168,14 +168,24 @@
</div>
</a-col>
</a-row>
<InputSave :data="input" v-if="inputVisible" @closeModel="closeInput" @saveSuc="saveInput"/>
<OutputSave :data="output" v-if="outputVisible" @closeModel="closeOutput" @saveSuc="saveOutput"/>
<InputSave
:data="input"
v-if="inputVisible"
@closeModel="closeInput"
@saveSuc="saveInput"
/>
<OutputSave
:data="output"
v-if="outputVisible"
@closeModel="closeOutput"
@saveSuc="saveOutput"
/>
</div>
</template>
<script lang="ts" setup>
import InputSave from './Save/input.vue'
import OutputSave from './save/output.vue'
import InputSave from './Save/input.vue';
import OutputSave from './save/output.vue';
import {
EditOutlined,
DeleteOutlined,
@ -439,24 +449,24 @@ handleInputSearch();
handleOutputSearch();
const showInput = () => {
inputVisible.value = true;
}
const closeInput = () =>{
};
const closeInput = () => {
inputVisible.value = false;
}
const saveInput = () =>{
};
const saveInput = () => {
inputVisible.value = false;
handleInputSearch();
}
const showOutput = () =>{
};
const showOutput = () => {
outputVisible.value = true;
}
const closeOutput = () =>{
};
const closeOutput = () => {
outputVisible.value = false;
}
const saveOutput = () =>{
};
const saveOutput = () => {
outputVisible.value = false;
handleOutputSearch();
}
};
</script>
<style lang="less" scoped>
.alarmTitle {

View File

@ -35,12 +35,13 @@
</div>
</div>
</a-card>
<a-button
<!-- <a-button
type="primary"
size="middle"
@click="handleSaveLevel"
>保存</a-button
>
> -->
<PermissionButton type="primary" size="middle" @click="handleSaveLevel" hasPermission="rule-engine/Alarm/Config:update">保存</PermissionButton>
</div>
</a-col>
<a-col :span="10">

View File

@ -46,9 +46,7 @@
<a-form-item label="说明" name="description">
<a-textarea v-model:value="form.description"></a-textarea>
</a-form-item>
<a-button type="primary" @click="handleSave" :loading="loading"
>保存</a-button
>
<PermissionButton type="primary" @click="handleSave" :hasPermission="['rule-engine/Alarm/Configuration:add','rule-engine/Alarm/Configuration:update']">保存</PermissionButton>
</a-form>
</div>
</template>
@ -63,6 +61,7 @@ import { useMenuStore } from '@/store/menu';
import { useRoute } from 'vue-router';
import { useAlarmConfigurationStore } from '@/store/alarm';
import { storeToRefs } from 'pinia';
import { usePermissionStore } from '@/store/permission';
const route = useRoute();
const id = route.query?.id;
let selectDisable = ref(false);

View File

@ -11,7 +11,7 @@
>
<template #headerTitle>
<a-space>
<PermissionButton type="primary" @click="showModal">
<PermissionButton type="primary" @click="showModal" hasPermission="rule-engine/Alarm/Configuration:add">
<template #icon><AIcon type="PlusOutlined" /></template>
新增
</PermissionButton>
@ -64,6 +64,7 @@
...item.tooltip,
}"
@click="item.onClick"
:hasPermission="'rule-engine/Alarm/Configuration:'+item.key"
>
<AIcon :type="item.icon" />
<span>{{ item?.text }}</span>
@ -137,7 +138,7 @@ const getActions = (
if (!data) return [];
const actions: ActionsType[] = [
{
key: 'unbind',
key: 'action',
text: '解绑',
icon: 'DisconnectOutlined',
popConfirm: {

View File

@ -10,7 +10,7 @@
:columns="columns"
:request="queryList"
:gridColumn="3"
:gridColumns="[1,2,3]"
:gridColumns="[1, 2, 3]"
ref="tableRef"
:defaultParams="{
sorts: [{ name: 'createTime', order: 'desc' }],
@ -18,11 +18,18 @@
:params="params"
>
<template #headerTitle>
<a-space>
<a-button type="primary" @click="add"
><plus-outlined />新增</a-button
<j-space>
<PermissionButton
type="primary"
@click="add"
hasPermission="device/Instance:add"
>
</a-space>
<template #icon
><AIcon type="PlusOutlined"
/></template>
新增
</PermissionButton>
</j-space>
</template>
<template #card="slotProps">
<CardBox
@ -74,13 +81,17 @@
<template #actions="item">
<PermissionButton
v-if="
item.key != 'trigger' ||
item.key != 'tigger' ||
slotProps.sceneTriggerType == 'manual'
"
:disabled="item.disabled"
:popConfirm="item.popConfirm"
:tooltip="{ ...item.tootip }"
@click="item.onClick"
:hasPermission="
'rule-engine/Alarm/Configuration:' +
item.key
"
>
<AIcon
type="DeleteOutlined"
@ -136,7 +147,7 @@
>
<PermissionButton
v-if="
i.key != 'trigger' ||
i.key != 'tigger' ||
slotProps.sceneTriggerType == 'manual'
"
:disabled="i.disabled"
@ -147,6 +158,10 @@
@click="i.onClick"
type="link"
style="padding: 0px"
:hasPermission="
'rule-engine/Alarm/Configuration:' +
item.key
"
>
<template #icon
><AIcon :type="i.icon"
@ -161,7 +176,6 @@
</template>
<script lang="ts" setup>
import JTable from '@/components/Table';
import {
queryList,
_enable,
@ -323,7 +337,7 @@ const getActions = (
}
const actions = [
{
key: 'trigger',
key: 'tigger',
text: '手动触发',
disabled: data?.state?.value === 'disabled',
tooltip: {
@ -353,7 +367,7 @@ const getActions = (
icon: 'LikeOutlined',
},
{
key: 'edit',
key: 'update',
text: '编辑',
tooltip: {
title: '编辑',

View File

@ -5,7 +5,7 @@
target="alarm-log-detail"
@search="handleSearch"
></Search>
<JTable
<JProTable
:columns="columns"
model="TABLE"
:request="queryList"
@ -39,7 +39,7 @@
</template>
</a-space>
</template>
</JTable>
</JProTable>
<Info v-if="visiable" :data="current" @close="close"/>
</page-container>
</template>

View File

@ -13,7 +13,7 @@
target="bind-channel"
@search="handleSearch"
></Search>
<JTable
<JProTable
model="TABLE"
:columns="columns"
:defaultParams="{
@ -47,7 +47,7 @@
}}
</span>
</template>
</JTable>
</JProTable>
</a-modal>
</template>

View File

@ -28,7 +28,7 @@
:columns="columns"
:request="handleSearch"
:params="params"
:gridColumns="[1,1,2]"
:gridColumns="[1, 1, 2]"
:gridColumn="2"
model="CARD"
>
@ -98,16 +98,23 @@
</span>
</a-col>
</a-row>
</template>
<template #actions="item">
<PermissionButton
:disabled="item.key === 'solve' && slotProps.state.value ==='normal'"
:disabled="
item.key === 'solve' &&
slotProps.state.value === 'normal'
"
:popConfirm="item.popConfirm"
:tooltip="{
...item.tooltip,
}"
@click="item.onClick"
:hasPermission="
item.key == 'solve'
? 'rule-engine/Alarm/Log:action'
: 'rule-engine/Alarm/Log:view'
"
>
<AIcon :type="item.icon" />
<span>{{ item?.text }}</span>
@ -116,8 +123,16 @@
</CardBox>
</template>
</JProTable>
<SolveComponent :data="data" v-if="data.solveVisible" @closeSolve="closeSolve"/>
<SolveLog :data="data.current" v-if="data.logVisible" @closeLog="closeLog"/>
<SolveComponent
:data="data"
v-if="data.solveVisible"
@closeSolve="closeSolve"
/>
<SolveLog
:data="data.current"
v-if="data.logVisible"
@closeLog="closeLog"
/>
</div>
</template>
@ -139,6 +154,7 @@ import type { ActionsType } from '@/components/Table';
import SolveComponent from '../SolveComponent/index.vue';
import SolveLog from '../SolveLog/index.vue'
import { useMenuStore } from '@/store/menu';
import { usePermissionStore } from '@/store/permission';
const menuStory = useMenuStore();
const alarmStore = useAlarmStore();
@ -368,6 +384,13 @@ const getActions = (
onClick: () =>{
data.value.current = currentData;
data.value.solveVisible = true;
},
popConfirm:{
title: !usePermissionStore().hasPermission('rule-engine/Alarm/Log:action')
? '暂无权限,请联系管理员'
: data.state?.value === 'normal'
? '无告警'
: ''
}
},
{

View File

@ -20,7 +20,7 @@
:title="item.alarmName"
placement="topLeft"
>
<a>{{ item.alarmName }}</a>
<a @click="()=>{return jumpDetail(item)}">{{ item.alarmName }}</a>
</a-tooltip>
</div>
<div class="new-alarm-item-state">
@ -63,6 +63,7 @@
<script lang="ts" setup>
import { Empty } from 'ant-design-vue';
import { getImage } from '@/utils/comm';
import { useMenuStore } from '@/store/menu';
import moment from 'moment';
const props = defineProps({
alarmList: {
@ -70,6 +71,10 @@ const props = defineProps({
default: [],
},
});
const menuStore = useMenuStore();
const jumpDetail = (item:any) =>{
menuStore.jumpPage(`rule-engine/Alarm/Log/Detail`,{id:item.id});
}
</script>
<style scoped lang="less">
.new-alarm {

View File

@ -6,7 +6,7 @@
target="device-instance"
@search="handleSearch"
></Search>
<JTable
<JProTable
:columns="columns"
:request="queryList"
ref="tableRef"
@ -16,11 +16,18 @@
:params="params"
>
<template #headerTitle>
<a-space>
<a-button type="primary" @click="add"
><plus-outlined />新增</a-button
<j-space>
<PermissionButton
type="primary"
@click="add"
hasPermission="rule-engine/Instance:add"
>
</a-space>
<template #icon
><AIcon type="PlusOutlined"
/></template>
新增
</PermissionButton>
</j-space>
</template>
<template #card="slotProps">
<CardBox
@ -29,6 +36,7 @@
v-bind="slotProps"
:status="slotProps.state?.value"
:statusText="slotProps.state?.text"
@click="openRuleEditor"
:statusNames="{
started: 'success',
disable: 'error',
@ -62,6 +70,9 @@
:tooltip="{
...item.tooltip,
}"
:hasPermission="
'rule-engine/Instance:' + item.key
"
@click="item.onClick"
>
<AIcon
@ -113,7 +124,7 @@
</template>
</a-space>
</template>
</JTable>
</JProTable>
<!-- 新增编辑 -->
<Save
ref="saveRef"
@ -138,6 +149,7 @@ import type { ActionsType } from '@/components/Table/index.vue';
import { getImage } from '@/utils/comm';
import { message } from 'ant-design-vue';
import Save from './Save/index.vue';
import { SystemConst } from '@/utils/consts';
const params = ref<Record<string, any>>({});
let isAdd = ref<number>(0);
let title = ref<string>('');
@ -216,7 +228,7 @@ const getActions = (
}
const actions = [
{
key: 'edit',
key: 'update',
text: '编辑',
tooltip: {
title: '编辑',
@ -312,6 +324,11 @@ const refresh = () => {
const handleSearch = (e: any) => {
params.value = e;
};
const openRuleEditor = (item: any) => {
window.open(
`/${SystemConst.API_BASE}/rule-editor/index.html#flow/${item.id}`,
);
};
</script>
<style scoped>
</style>