Merge branch 'dev' of github.com:jetlinks/jetlinks-ui-vue into dev

This commit is contained in:
JiangQiming 2023-03-15 14:55:51 +08:00
commit 471b12a2fa
20 changed files with 189 additions and 191 deletions

View File

@ -1,7 +1,9 @@
import server from '@/utils/request' import server from '@/utils/request'
// 获取记录列表 // 获取记录列表
export const getList_api = (data:object): any =>server.post(`/notifications/_query`,data) export const getList_api = (data:object): any =>server.get(`/notifications/_query`,encodeParams(data))
// 获取未读记录列表
export const getListByUnRead_api = (data:object): any =>server.post(`/notifications/_query`,data)
// 修改记录状态 // 修改记录状态
export const changeStatus_api = (type:'_read'|'_unread',data:string[]): any =>server.post(`/notifications/${type}`,data) export const changeStatus_api = (type:'_read'|'_unread',data:string[]): any =>server.post(`/notifications/${type}`,data)

View File

@ -19,7 +19,7 @@
</template> </template>
<script setup lang="tsx"> <script setup lang="tsx">
import { getList_api } from '@/api/account/notificationRecord'; import { getListByUnRead_api } from '@/api/account/notificationRecord';
import NoticeInfo from './NoticeInfo.vue'; import NoticeInfo from './NoticeInfo.vue';
import { getWebSocket } from '@/utils/websocket'; import { getWebSocket } from '@/utils/websocket';
import { notification, Button } from 'ant-design-vue'; import { notification, Button } from 'ant-design-vue';
@ -93,7 +93,7 @@ const getList = () => {
}, },
], ],
}; };
getList_api(params) getListByUnRead_api(params)
.then((resp: any) => { .then((resp: any) => {
list.value = resp.result.data; list.value = resp.result.data;
total.value = resp.result.total; total.value = resp.result.total;

View File

@ -1,6 +1,6 @@
<!-- 绑定设备 --> <!-- 绑定设备 -->
<template> <template>
<a-modal <j-modal
:maskClosable="false" :maskClosable="false"
width="1000px" width="1000px"
:visible="true" :visible="true"
@ -12,7 +12,7 @@
:confirmLoading="btnLoading" :confirmLoading="btnLoading"
> >
<div style="margin-top: 10px"> <div style="margin-top: 10px">
<Search <pro-search
:columns="columns" :columns="columns"
target="child-device-bind" target="child-device-bind"
@search="handleSearch" @search="handleSearch"
@ -73,14 +73,14 @@
}} }}
</template> </template>
<template #state="slotProps"> <template #state="slotProps">
<a-badge <j-badge
:text="slotProps.state.text" :text="slotProps.state.text"
:status="statusMap.get(slotProps.state.value)" :status="statusMap.get(slotProps.state.value)"
/> />
</template> </template>
</JProTable> </JProTable>
</div> </div>
</a-modal> </j-modal>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@ -1,14 +1,14 @@
<template> <template>
<a-select allowClear v-model:value="_value" @change="onChange" placeholder="请选择" style="width: 100%"> <j-select allowClear v-model:value="_value" @change="onChange" placeholder="请选择" style="width: 100%">
<a-select-option <j-select-option
v-for="item in list" v-for="item in list"
:key="item.id" :key="item.id"
:value="item.id" :value="item.id"
:label="item.name" :label="item.name"
:filter-option="filterOption" :filter-option="filterOption"
>{{ item.name }}</a-select-option >{{ item.name }}</j-select-option
> >
</a-select> </j-select>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>

View File

@ -1,5 +1,5 @@
<template> <template>
<a-modal <j-modal
width="900px" width="900px"
title="批量映射" title="批量映射"
visible visible
@ -10,49 +10,49 @@
<div class="map-tree-top"> <div class="map-tree-top">
采集器的点位名称与属性名称一致时将自动映射绑定有多个采集器点位名称与属性名称一致时以第1个采集器的点位数据进行绑定 采集器的点位名称与属性名称一致时将自动映射绑定有多个采集器点位名称与属性名称一致时以第1个采集器的点位数据进行绑定
</div> </div>
<a-spin :spinning="loading"> <j-spin :spinning="loading">
<div class="map-tree-content"> <div class="map-tree-content">
<a-card class="map-tree-content-card" title="源数据"> <j-card class="map-tree-content-card" title="源数据">
<a-tree <j-tree
checkable checkable
:height="300" :height="300"
:tree-data="dataSource" :tree-data="dataSource"
:checkedKeys="checkedKeys" :checkedKeys="checkedKeys"
@check="onCheck" @check="onCheck"
/> />
</a-card> </j-card>
<div style="width: 100px"> <div style="width: 100px">
<a-button <j-button
:disabled="rightList.length >= leftList.length" :disabled="rightList.length >= leftList.length"
@click="onRight" @click="onRight"
>加入右侧</a-button >加入右侧</j-button
> >
</div> </div>
<a-card class="map-tree-content-card" title="采集器"> <j-card class="map-tree-content-card" title="采集器">
<a-list <j-list
size="small" size="small"
:data-source="rightList" :data-source="rightList"
class="map-tree-content-card-list" class="map-tree-content-card-list"
> >
<template #renderItem="{ item }"> <template #renderItem="{ item }">
<a-list-item> <j-list-item>
{{ item.title }} {{ item.title }}
<template #actions> <template #actions>
<a-popconfirm <j-popconfirm
title="确定删除?" title="确定删除?"
@confirm="_delete(item.key)" @confirm="_delete(item.key)"
> >
<AIcon type="DeleteOutlined" /> <AIcon type="DeleteOutlined" />
</a-popconfirm> </j-popconfirm>
</template> </template>
</a-list-item> </j-list-item>
</template> </template>
</a-list> </j-list>
</a-card> </j-card>
</div> </div>
</a-spin> </j-spin>
</div> </div>
</a-modal> </j-modal>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -119,6 +119,7 @@ const onCheck = (keys: string[], e: any) => {
}; };
const onRight = () => { const onRight = () => {
console.log(rightList.value,leftList.value);
rightList.value = leftList.value; rightList.value = leftList.value;
}; };

View File

@ -1,49 +1,51 @@
<template> <template>
<a-spin :spinning="loading" v-if="_metadata.length"> <j-spin :spinning="loading" v-if="_metadata.length">
<a-card :bordered="false"> <j-card :bordered="false">
<template #title> <template #title>
<TitleComponent data="点位映射"></TitleComponent> <TitleComponent data="点位映射"></TitleComponent>
</template> </template>
<template #extra> <template #extra>
<a-space> <j-space>
<a-button @click="showModal">批量映射</a-button> <j-button @click="showModal">批量映射</j-button>
<a-button type="primary" @click="onSave">保存并应用</a-button> <j-button type="primary" @click="onSave"
</a-space> >保存并应用</j-button
>
</j-space>
</template> </template>
<a-form ref="formRef" :model="modelRef"> <j-form ref="formRef" :model="modelRef">
<a-table :dataSource="modelRef.dataSource" :columns="columns"> <j-table :dataSource="modelRef.dataSource" :columns="columns">
<template #headerCell="{ column }"> <template #headerCell="{ column }">
<template v-if="column.key === 'collectorId'"> <template v-if="column.key === 'collectorId'">
采集器 采集器
<a-tooltip title="边缘网关代理的真实物理设备"> <j-tooltip title="边缘网关代理的真实物理设备">
<AIcon type="QuestionCircleOutlined" /> <AIcon type="QuestionCircleOutlined" />
</a-tooltip> </j-tooltip>
</template> </template>
</template> </template>
<template #bodyCell="{ column, record, index }"> <template #bodyCell="{ column, record, index }">
<template v-if="column.dataIndex === 'channelId'"> <template v-if="column.dataIndex === 'channelId'">
<a-form-item <j-form-item
:name="['dataSource', index, 'channelId']" :name="['dataSource', index, 'channelId']"
> >
<a-select <j-select
style="width: 100%" style="width: 100%"
v-model:value="record[column.dataIndex]" v-model:value="record[column.dataIndex]"
placeholder="请选择" placeholder="请选择"
allowClear allowClear
:filter-option="filterOption" :filter-option="filterOption"
> >
<a-select-option <j-select-option
v-for="item in channelList" v-for="item in channelList"
:key="item.value" :key="item.value"
:value="item.value" :value="item.value"
:label="item.label" :label="item.label"
>{{ item.label }}</a-select-option >{{ item.label }}</j-select-option
> >
</a-select> </j-select>
</a-form-item> </j-form-item>
</template> </template>
<template v-if="column.dataIndex === 'collectorId'"> <template v-if="column.dataIndex === 'collectorId'">
<a-form-item <j-form-item
:name="['dataSource', index, 'collectorId']" :name="['dataSource', index, 'collectorId']"
:rules="[ :rules="[
{ {
@ -58,10 +60,10 @@
type="COLLECTOR" type="COLLECTOR"
:edgeId="instanceStore.current.id" :edgeId="instanceStore.current.id"
/> />
</a-form-item> </j-form-item>
</template> </template>
<template v-if="column.dataIndex === 'pointId'"> <template v-if="column.dataIndex === 'pointId'">
<a-form-item <j-form-item
:name="['dataSource', index, 'pointId']" :name="['dataSource', index, 'pointId']"
:rules="[ :rules="[
{ {
@ -76,33 +78,33 @@
type="POINT" type="POINT"
:edgeId="instanceStore.current.id" :edgeId="instanceStore.current.id"
/> />
</a-form-item> </j-form-item>
</template> </template>
<template v-if="column.dataIndex === 'id'"> <template v-if="column.dataIndex === 'id'">
<a-badge <j-badge
v-if="record[column.dataIndex]" v-if="record[column.dataIndex]"
status="success" status="success"
text="已绑定" text="已绑定"
/> />
<a-badge v-else status="error" text="未绑定" /> <j-badge v-else status="error" text="未绑定" />
</template> </template>
<template v-if="column.key === 'action'"> <template v-if="column.key === 'action'">
<a-tooltip title="解绑"> <j-tooltip title="解绑">
<a-popconfirm <j-popconfirm
title="确认解绑" title="确认解绑"
:disabled="!record.id" :disabled="!record.id"
@confirm="unbind(record.id)" @confirm="unbind(record.id)"
> >
<a-button type="link" :disabled="!record.id" <j-button type="link" :disabled="!record.id"
><AIcon type="icon-jiebang" ><AIcon type="icon-jiebang"
/></a-button> /></j-button>
</a-popconfirm> </j-popconfirm>
</a-tooltip> </j-tooltip>
</template> </template>
</template> </template>
</a-table> </j-table>
</a-form> </j-form>
</a-card> </j-card>
<PatchMapping <PatchMapping
:deviceId="instanceStore.current.parentId" :deviceId="instanceStore.current.parentId"
v-if="visible" v-if="visible"
@ -112,10 +114,10 @@
:edgeId="instanceStore.current.id" :edgeId="instanceStore.current.id"
:deviceData="deviceData" :deviceData="deviceData"
/> />
</a-spin> </j-spin>
<a-card v-else> <j-card v-else>
<JEmpty description="暂无数据,请配置物模型" style="margin: 10% 0" /> <JEmpty description="暂无数据,请配置物模型" style="margin: 10% 0" />
</a-card> </j-card>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -175,7 +177,7 @@ const filterOption = (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0; return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
}; };
const props = defineProps(['productList']); const props = defineProps(['productList']);
const _emit = defineEmits(['close']); const _emit = defineEmits(['close','getEdgeMap']);
const instanceStore = useInstanceStore(); const instanceStore = useInstanceStore();
let _metadata = ref(); let _metadata = ref();
const loading = ref<boolean>(false); const loading = ref<boolean>(false);
@ -187,7 +189,7 @@ const modelRef = reactive({
const deviceData = ref(); const deviceData = ref();
const formRef = ref(); const formRef = ref();
const visible = ref<boolean>(false); const visible = ref<boolean>(false);
/**获取通道列表 */
const getChannel = async () => { const getChannel = async () => {
if (instanceStore.current?.id) { if (instanceStore.current?.id) {
const resp: any = await edgeChannel(instanceStore.current.id); const resp: any = await edgeChannel(instanceStore.current.id);
@ -200,51 +202,31 @@ const getChannel = async () => {
} }
} }
}; };
/**
* 初始化
*/
const handleSearch = async () => { const handleSearch = async () => {
loading.value = true; loading.value = true;
getChannel(); getChannel();
modelRef.dataSource = _metadata.value; modelRef.dataSource = _metadata.value;
console.log(modelRef.dataSource);
// if (_metadata.value && _metadata.value.length) {
// console.log(1234);
// const resp: any = await getEdgeMap(instanceStore.current?.orgId || '', {
// deviceId: instanceStore.current.id,
// query: {},
// }).catch(() => {
// modelRef.dataSource = _metadata;
// loading.value = false;
// });
// if (resp.status === 200) {
// const array = resp.result?.[0].reduce((x: any, y: any) => {
// const metadataId = _metadata.find(
// (item: any) => item.metadataId === y.metadataId,
// );
// if (metadataId) {
// Object.assign(metadataId, y);
// } else {
// x.push(y);
// }
// return x;
// }, _metadata);
// modelRef.dataSource = array;
// }
// }
loading.value = false; loading.value = false;
}; };
/**
* 解绑映射
* @param id 选择解绑id
*/
const unbind = async (id: string) => { const unbind = async (id: string) => {
if (id) { if (id) {
const resp = await removeEdgeMap( const resp = await removeEdgeMap(
instanceStore.current?.parentId || '', instanceStore.current?.id || '',
{ {
deviceId: instanceStore.current.id, deviceId: instanceStore.current.parentId,
idList: [id], idList: [id],
}, },
); );
if (resp.status === 200) { if (resp.status === 200) {
message.success('操作成功!'); message.success('操作成功!');
handleSearch(); _emit('getEdgeMap');
} }
} }
}; };
@ -280,8 +262,8 @@ const onSave = async () => {
productName: props.productList.find( productName: props.productList.find(
(item: any) => item.id === form.value?.productId, (item: any) => item.id === form.value?.productId,
).name, ).name,
parentId: instanceStore.current.id, parentId: instanceStore.current.id, // id
id: instanceStore.current.parentId id: instanceStore.current.parentId // id
? instanceStore.current.parentId ? instanceStore.current.parentId
: undefined, : undefined,
}; };
@ -329,7 +311,4 @@ const showModal = async () => {
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
:deep(.ant-form-item) {
margin: 0 !important;
}
</style> </style>

View File

@ -2,7 +2,7 @@
<div> <div>
<TitleComponent data="基本信息"> <TitleComponent data="基本信息">
<template #extra> <template #extra>
<j-button @click="comeBack">返回</j-button> <j-button @click="comeBack" style="margin-left: 10px;">返回</j-button>
</template> </template>
</TitleComponent> </TitleComponent>
<j-form layout="vertical" :model="form" ref="formRef"> <j-form layout="vertical" :model="form" ref="formRef">
@ -39,7 +39,10 @@
</j-row> </j-row>
<j-row :gutter="24" v-if="visible"> <j-row :gutter="24" v-if="visible">
<j-col :span="24" <j-col :span="24"
><EdgeMap :productList="productList" @close="comeBack" ><EdgeMap
:productList="productList"
@close="comeBack"
@getEdgeMap="getEdgeMapData"
/></j-col> /></j-col>
</j-row> </j-row>
</j-form> </j-form>
@ -64,67 +67,80 @@ const formRef = ref();
const emit = defineEmits(['closeChildSave']); const emit = defineEmits(['closeChildSave']);
const productList = ref(); const productList = ref();
const visible = ref(false); const visible = ref(false);
/**
* 获取产品列表
*/
const getProductList = async () => { const getProductList = async () => {
const res = await getProductListNoPage({ const res = await getProductListNoPage({
terms: [{ column: 'accessProvider', value: 'edge-child-device' }], terms: [{ column: 'accessProvider', value: 'edge-child-device' }],
}); });
if (res.status === 200) { if (res.status === 200) {
productList.value = res.result; productList.value = res.result;
if (props.childData?.id) { getEdgeMapData();
current.value.parentId = props.childData.id;
form.name = props.childData?.name;
form.productId = props.childData?.productId;
selectChange(form.productId);
if (current.value.metadata) {
const metadata = current.value.metadata;
if (metadata && metadata.length !== 0) {
getEdgeMap(current.value.id, {
deviceId: props.childData.id,
query: {},
}).then((res) => {
if (res.status === 200) {
// console.log(res.result)
//
const array = res.result[0]?.reduce(
(x: any, y: any) => {
const metadataId = metadata.find(
(item: any) =>
item.metadataId === y.metadataId,
);
if (metadataId) {
Object.assign(metadataId, y);
} else {
x.push(y);
}
return x;
},
metadata,
);
//
const items = array.filter(
(item: any) => item.metadataName,
);
current.value.metadata = items;
const delList = array
.filter((a: any) => !a.metadataName)
.map((b: any) => b.id);
//
if (delList && delList.length !== 0) {
removeEdgeMap(current.value.id, {
deviceId: props.childData.id,
idList: [...delList],
});
}
}
});
}
}
visible.value = true;
} else {
current.value.parentId = '';
}
} }
}; };
/**
* 获取映射数据
*/
const getEdgeMapData = () => {
if (props.childData?.id) {
current.value.parentId = props.childData.id;
form.name = props.childData?.name;
form.productId = props.childData?.productId;
selectChange(form.productId);
if (current.value.metadata) {
const metadata = current.value.metadata;
if (metadata && metadata.length !== 0) {
getEdgeMap(current.value.id, {
deviceId: props.childData.id,
query: {},
}).then((res) => {
if (res.status === 200) {
// console.log(res.result)
//
const array = res.result[0]?.reduce(
(x: any, y: any) => {
const metadataId = metadata.find(
(item: any) =>
item.metadataId === y.metadataId,
);
if (metadataId) {
Object.assign(metadataId, y);
} else {
x.push(y);
}
return x;
},
metadata,
);
//
const items = array.filter(
(item: any) => item.metadataName,
);
current.value.metadata = items;
const delList = array
.filter((a: any) => !a.metadataName)
.map((b: any) => b.id);
//
if (delList && delList.length !== 0) {
removeEdgeMap(current.value.id, {
deviceId: props.childData.id,
idList: [...delList],
});
}
}
});
}
}
visible.value = true;
} else {
current.value.parentId = '';
}
};
/**
* 根据产品id获取对应映射列表
* @param e 产品id
*/
const selectChange = (e: any) => { const selectChange = (e: any) => {
if (e) { if (e) {
visible.value = true; visible.value = true;

View File

@ -1,12 +1,12 @@
<template> <template>
<a-card> <j-card>
<SaveChild <SaveChild
v-if="childVisible" v-if="childVisible"
@close-child-save="closeChildSave" @close-child-save="closeChildSave"
:childData="_current" :childData="_current"
/> />
<div v-else> <div v-else>
<Search <pro-search
:columns="columns" :columns="columns"
target="child-device" target="child-device"
@search="handleSearch" @search="handleSearch"
@ -76,7 +76,7 @@
}} }}
</template> </template>
<template #state="slotProps"> <template #state="slotProps">
<a-badge <j-badge
:text="slotProps.state.text" :text="slotProps.state.text"
:status="statusMap.get(slotProps.state.value)" :status="statusMap.get(slotProps.state.value)"
/> />
@ -108,7 +108,7 @@
</JProTable> </JProTable>
<BindChildDevice v-if="visible" @change="closeBindDevice" /> <BindChildDevice v-if="visible" @change="closeBindDevice" />
</div> </div>
</a-card> </j-card>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@ -714,7 +714,7 @@
placeholder="请选中角色" placeholder="请选中角色"
></j-select> ></j-select>
<PermissionButton <PermissionButton
:uhasPermission="`${rolePermission}:update`" :hasPermission="`${rolePermission}:update`"
type="link" type="link"
@click=" @click="
clickAddItem( clickAddItem(
@ -755,7 +755,7 @@
</template> </template>
</j-tree-select> </j-tree-select>
<PermissionButton <PermissionButton
:uhasPermission="`${deptPermission}:update`" :hasPermission="`${deptPermission}:update`"
type="link" type="link"
@click=" @click="
clickAddItem( clickAddItem(
@ -1297,7 +1297,7 @@
placeholder="请选中角色" placeholder="请选中角色"
></j-select> ></j-select>
<PermissionButton <PermissionButton
:uhasPermission="`${rolePermission}:update`" :hasPermission="`${rolePermission}:update`"
type="link" type="link"
@click=" @click="
clickAddItem( clickAddItem(
@ -1332,7 +1332,7 @@
</template> </template>
</j-tree-select> </j-tree-select>
<PermissionButton <PermissionButton
:uhasPermission="`${deptPermission}:update`" :hasPermission="`${deptPermission}:update`"
type="link" type="link"
@click=" @click="
clickAddItem( clickAddItem(

View File

@ -20,7 +20,7 @@
<template #headerTitle> <template #headerTitle>
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:add`" :hasPermission="`${permission}:add`"
type="primary" type="primary"
@click="() => table.toSave()" @click="() => table.toSave()"
> >
@ -110,7 +110,7 @@
</j-dropdown> </j-dropdown>
<PermissionButton <PermissionButton
v-else v-else
:uhasPermission="item.permission" :hasPermission="item.permission"
:tooltip="item.tooltip" :tooltip="item.tooltip"
:pop-confirm="item.popConfirm" :pop-confirm="item.popConfirm"
@click="item.onClick" @click="item.onClick"
@ -151,7 +151,7 @@
<j-space :size="16"> <j-space :size="16">
<PermissionButton <PermissionButton
v-for="i in table.getActions(slotProps, 'table')" v-for="i in table.getActions(slotProps, 'table')"
:uhasPermission="i.permission" :hasPermission="i.permission"
type="link" type="link"
:tooltip="i.tooltip" :tooltip="i.tooltip"
:pop-confirm="i.popConfirm" :pop-confirm="i.popConfirm"

View File

@ -97,7 +97,7 @@
</template> </template>
<template #action="slotProps"> <template #action="slotProps">
<PermissionButton <PermissionButton
:uhasPermission="`{permission}:delete`" :hasPermission="`{permission}:delete`"
type="link" type="link"
:tooltip="{ title: '删除' }" :tooltip="{ title: '删除' }"
:popConfirm="{ :popConfirm="{

View File

@ -20,7 +20,7 @@
<template #headerTitle> <template #headerTitle>
<PermissionButton <PermissionButton
type="primary" type="primary"
:uhasPermission="`${permission}:add`" :hasPermission="`${permission}:add`"
@click="table.openDialog({})" @click="table.openDialog({})"
> >
<AIcon type="PlusOutlined" />新增 <AIcon type="PlusOutlined" />新增
@ -47,7 +47,7 @@
<template #action="slotProps"> <template #action="slotProps">
<j-space :size="16"> <j-space :size="16">
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:update`" :hasPermission="`${permission}:update`"
type="link" type="link"
:tooltip="{ :tooltip="{
title: '编辑', title: '编辑',
@ -57,7 +57,7 @@
<AIcon type="EditOutlined" /> <AIcon type="EditOutlined" />
</PermissionButton> </PermissionButton>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:manage`" :hasPermission="`${permission}:manage`"
type="link" type="link"
:tooltip="{ :tooltip="{
title: title:
@ -81,7 +81,7 @@
<AIcon type="icon-ziyuankuguanli" /> <AIcon type="icon-ziyuankuguanli" />
</PermissionButton> </PermissionButton>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:action`" :hasPermission="`${permission}:action`"
type="link" type="link"
:popConfirm="{ :popConfirm="{
title: `确定要${ title: `确定要${
@ -109,7 +109,7 @@
</PermissionButton> </PermissionButton>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:delete`" :hasPermission="`${permission}:delete`"
type="link" type="link"
:tooltip="{ :tooltip="{
title: table.getRowStatus(slotProps) title: table.getRowStatus(slotProps)

View File

@ -20,7 +20,7 @@
<template #headerTitle> <template #headerTitle>
<j-space> <j-space>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:assert`" :hasPermission="`${permission}:assert`"
type="primary" type="primary"
@click="table.clickAdd" @click="table.clickAdd"
> >
@ -32,7 +32,7 @@
<j-menu> <j-menu>
<j-menu-item> <j-menu-item>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:bind`" :hasPermission="`${permission}:bind`"
:popConfirm="{ :popConfirm="{
title: `是否批量解除绑定`, title: `是否批量解除绑定`,
onConfirm: () => onConfirm: () =>
@ -46,7 +46,7 @@
</j-menu-item> </j-menu-item>
<j-menu-item> <j-menu-item>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:assert`" :hasPermission="`${permission}:assert`"
@click="table.clickEdit()" @click="table.clickEdit()"
> >
<AIcon type="EditOutlined" />批量编辑 <AIcon type="EditOutlined" />批量编辑
@ -117,14 +117,14 @@
</template> </template>
<template #actions> <template #actions>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:assert`" :hasPermission="`${permission}:assert`"
@click="table.clickEdit(slotProps)" @click="table.clickEdit(slotProps)"
> >
<AIcon type="EditOutlined" /> <AIcon type="EditOutlined" />
</PermissionButton> </PermissionButton>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:bind`" :hasPermission="`${permission}:bind`"
:popConfirm="{ :popConfirm="{
title: `是否解除绑定`, title: `是否解除绑定`,
onConfirm: () => table.clickUnBind(slotProps), onConfirm: () => table.clickUnBind(slotProps),
@ -157,7 +157,7 @@
<j-space :size="16"> <j-space :size="16">
<PermissionButton <PermissionButton
v-for="i in table.getActions(slotProps, 'table')" v-for="i in table.getActions(slotProps, 'table')"
:uhasPermission="i.permission" :hasPermission="i.permission"
type="link" type="link"
:tooltip="i?.tooltip" :tooltip="i?.tooltip"
:pop-confirm="i.popConfirm" :pop-confirm="i.popConfirm"

View File

@ -20,7 +20,7 @@
<template #headerTitle> <template #headerTitle>
<j-space> <j-space>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:assert`" :hasPermission="`${permission}:assert`"
type="primary" type="primary"
@click="dialogs.addShow = true" @click="dialogs.addShow = true"
> >
@ -32,7 +32,7 @@
<j-menu> <j-menu>
<j-menu-item> <j-menu-item>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:bind`" :hasPermission="`${permission}:bind`"
:popConfirm="{ :popConfirm="{
title: `是否批量解除绑定`, title: `是否批量解除绑定`,
onConfirm: () => onConfirm: () =>
@ -46,7 +46,7 @@
</j-menu-item> </j-menu-item>
<j-menu-item> <j-menu-item>
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:assert`" :hasPermission="`${permission}:assert`"
@click="() => table.clickEdit()" @click="() => table.clickEdit()"
> >
<AIcon type="EditOutlined" />批量编辑 <AIcon type="EditOutlined" />批量编辑

View File

@ -203,7 +203,7 @@
<PermissionButton <PermissionButton
type="primary" type="primary"
:uhasPermission="`${permission}:update`" :hasPermission="`${permission}:update`"
@click="form.clickSave" @click="form.clickSave"
> >
保存 保存

View File

@ -10,7 +10,7 @@
<template #headerTitle> <template #headerTitle>
<PermissionButton <PermissionButton
type="primary" type="primary"
:uhasPermission="`${permission}:update`" :hasPermission="`${permission}:update`"
@click="openDialog('新增', {})" @click="openDialog('新增', {})"
> >
<AIcon type="PlusOutlined" />新增 <AIcon type="PlusOutlined" />新增

View File

@ -18,7 +18,7 @@
<template #headerTitle> <template #headerTitle>
<PermissionButton <PermissionButton
type="primary" type="primary"
:uhasPermission="`${permission}:add`" :hasPermission="`${permission}:add`"
@click="table.toDetails({})" @click="table.toDetails({})"
> >
<AIcon type="PlusOutlined" />新增 <AIcon type="PlusOutlined" />新增
@ -51,7 +51,7 @@
<PermissionButton <PermissionButton
type="link" type="link"
:uhasPermission="`${permission}:add`" :hasPermission="`${permission}:add`"
:tooltip="{ title: '新增子菜单' }" :tooltip="{ title: '新增子菜单' }"
@click="table.addChildren(slotProps)" @click="table.addChildren(slotProps)"
> >
@ -59,7 +59,7 @@
</PermissionButton> </PermissionButton>
<PermissionButton <PermissionButton
type="link" type="link"
:uhasPermission="`${permission}:delete`" :hasPermission="`${permission}:delete`"
:tooltip="{ title: '删除' }" :tooltip="{ title: '删除' }"
:popConfirm="{ :popConfirm="{
title: `是否删除该菜单`, title: `是否删除该菜单`,

View File

@ -76,7 +76,7 @@
<template #action="slotProps"> <template #action="slotProps">
<j-space :size="16"> <j-space :size="16">
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:update`" :hasPermission="`${permission}:update`"
type="link" type="link"
:tooltip="{ :tooltip="{
title: '编辑', title: '编辑',

View File

@ -66,7 +66,7 @@
<template v-else-if="column.key === 'action'"> <template v-else-if="column.key === 'action'">
<PermissionButton <PermissionButton
type="link" type="link"
:uhasPermission="`{permission}:delete`" :hasPermission="`{permission}:delete`"
:popConfirm="{ :popConfirm="{
title: `确定删除`, title: `确定删除`,
onConfirm: () => onConfirm: () =>

View File

@ -23,7 +23,7 @@
<template #headerTitle> <template #headerTitle>
<PermissionButton <PermissionButton
type="primary" type="primary"
:uhasPermission="`${permission}:add`" :hasPermission="`${permission}:add`"
@click="dialogVisible = true" @click="dialogVisible = true"
> >
<AIcon type="PlusOutlined" />新增 <AIcon type="PlusOutlined" />新增
@ -33,7 +33,7 @@
<template #action="slotProps"> <template #action="slotProps">
<j-space :size="16"> <j-space :size="16">
<PermissionButton <PermissionButton
:uhasPermission="`${permission}:update`" :hasPermission="`${permission}:update`"
type="link" type="link"
:tooltip="{ :tooltip="{
title: '编辑', title: '编辑',
@ -44,7 +44,7 @@
</PermissionButton> </PermissionButton>
<PermissionButton <PermissionButton
type="link" type="link"
:uhasPermission="`${permission}:delete`" :hasPermission="`${permission}:delete`"
:tooltip="{ title: '删除' }" :tooltip="{ title: '删除' }"
:popConfirm="{ :popConfirm="{
title: `确定要删除吗`, title: `确定要删除吗`,