Compare commits
No commits in common. "b01a5f663ee1023a6a4dd10653ff4764a943d22a" and "299b1c7bbbf717dbb98e1be2d4e9ac893583febe" have entirely different histories.
b01a5f663e
...
299b1c7bbb
@ -190,17 +190,6 @@ const routes = [
|
|||||||
parentRoute: 'warningManagement3'
|
parentRoute: 'warningManagement3'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: '/messageManagement',
|
|
||||||
name: 'messageManagement',
|
|
||||||
component: () => import('../views/WarningManagement/law/messageManagement/index.vue'),
|
|
||||||
meta: {
|
|
||||||
title: '消息推送设置',
|
|
||||||
breadcrumb: true,
|
|
||||||
parentRoute: 'warningManagement3'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
// 项目管理 - 区县
|
// 项目管理 - 区县
|
||||||
{
|
{
|
||||||
|
|||||||
@ -372,12 +372,6 @@ export default () => {
|
|||||||
path: '/dutyManagement'
|
path: '/dutyManagement'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 跳转到消息推送设置
|
|
||||||
const gotoMessagePage = () => {
|
|
||||||
router.push({
|
|
||||||
path: '/messageManagement'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getTableData();
|
getTableData();
|
||||||
@ -402,7 +396,6 @@ export default () => {
|
|||||||
columns,
|
columns,
|
||||||
gotoLedgerPage,
|
gotoLedgerPage,
|
||||||
gotoDutyPage,
|
gotoDutyPage,
|
||||||
gotoMessagePage,
|
|
||||||
|
|
||||||
modelVisible,
|
modelVisible,
|
||||||
model,
|
model,
|
||||||
|
|||||||
@ -17,7 +17,6 @@
|
|||||||
<el-button type="primary" @click="script.gotoLedgerPage">线下帮扶台账</el-button>
|
<el-button type="primary" @click="script.gotoLedgerPage">线下帮扶台账</el-button>
|
||||||
<el-button type="primary" @click="script.openScheduleDiaog">立即排班</el-button>
|
<el-button type="primary" @click="script.openScheduleDiaog">立即排班</el-button>
|
||||||
<el-button type="primary" @click="script.gotoDutyPage">值班管理</el-button>
|
<el-button type="primary" @click="script.gotoDutyPage">值班管理</el-button>
|
||||||
<el-button type="primary" @click="script.gotoMessagePage">消息推送设置</el-button>
|
|
||||||
<el-button type="primary" color="#952DE6" @click="">导出</el-button>
|
<el-button type="primary" color="#952DE6" @click="">导出</el-button>
|
||||||
<input type="file" ref="fileInput" style="display: none" @change="handleFileSelect" accept=".*"></input>
|
<input type="file" ref="fileInput" style="display: none" @change="handleFileSelect" accept=".*"></input>
|
||||||
<!-- <el-button type="primary" @click="script.gotoLedgerPage">驻地台账</el-button> -->
|
<!-- <el-button type="primary" @click="script.gotoLedgerPage">驻地台账</el-button> -->
|
||||||
|
|||||||
@ -1,267 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="detail-container">
|
|
||||||
<el-form ref="formRef" :model="form" label-position="right" label-width="auto"
|
|
||||||
style="max-height: 60vh; overflow-y: hidden; padding-right: 50px" :rules="rules">
|
|
||||||
|
|
||||||
<el-form-item label="" prop="schedules">
|
|
||||||
<div class="user-select-container">
|
|
||||||
<!-- 左侧用户列表 -->
|
|
||||||
<div class="user-list-panel">
|
|
||||||
<div class="panel-title">用户列表</div>
|
|
||||||
<div class="user-list">
|
|
||||||
<div v-for="user in currentUsers" :key="user.userId" class="user-item"
|
|
||||||
:class="{ 'selected': isUserSelected(user) }" @click="toggleUserSelection(user)">
|
|
||||||
<span class="user-name">{{ user.realName || user.nickName || user.account }}</span>
|
|
||||||
<span class="user-position">{{ user.positionName }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 右侧已选择用户 -->
|
|
||||||
<div class="selected-panel">
|
|
||||||
<div class="panel-title">已选择用户 ({{ selectedUsers.length }})</div>
|
|
||||||
<div class="selected-user-list">
|
|
||||||
<div v-for="user in selectedUsers" :key="user.userId" class="selected-user-item">
|
|
||||||
<div class="user-info">
|
|
||||||
<span class="user-name">{{ user.realName || user.nickName || user.account }}</span>
|
|
||||||
<span class="user-position">{{ user.positionName }}</span>
|
|
||||||
</div>
|
|
||||||
<el-button type="danger" size="small" icon="Delete" circle @click.stop="removeSelectedUser(user)" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
</el-form>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { ref, computed, onMounted, watch } from "vue";
|
|
||||||
import { request } from "@/utils/request";
|
|
||||||
import { ElMessage } from 'element-plus';
|
|
||||||
|
|
||||||
const formRef = ref(null);
|
|
||||||
|
|
||||||
// 当前显示的用户列表
|
|
||||||
const currentUsers = ref([]);
|
|
||||||
// 已选择的用户列表
|
|
||||||
const selectedUsers = ref([]);
|
|
||||||
|
|
||||||
defineExpose({
|
|
||||||
formRef,
|
|
||||||
});
|
|
||||||
const props = defineProps({
|
|
||||||
form: {
|
|
||||||
type: Object,
|
|
||||||
default: () => ({}),
|
|
||||||
},
|
|
||||||
orgId: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
},
|
|
||||||
orgName: {
|
|
||||||
type: String,
|
|
||||||
default: ''
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
const rules = computed(() => {
|
|
||||||
return {
|
|
||||||
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// 检查用户是否已被选择
|
|
||||||
const isUserSelected = (user) => {
|
|
||||||
return selectedUsers.value.some(selected => selected.userId === user.userId);
|
|
||||||
};
|
|
||||||
|
|
||||||
// 切换用户选择状态
|
|
||||||
const toggleUserSelection = (user) => {
|
|
||||||
if (isUserSelected(user)) {
|
|
||||||
removeSelectedUser(user);
|
|
||||||
} else {
|
|
||||||
// 添加用户时初始化时间范围和orgId
|
|
||||||
selectedUsers.value.push({
|
|
||||||
// ...user,
|
|
||||||
// orgId: user.orgId, // 确保包含orgId
|
|
||||||
// timeRange: null
|
|
||||||
...user,
|
|
||||||
orgId: user.orgId,
|
|
||||||
orgName: props.orgName,
|
|
||||||
userId: user.userId,
|
|
||||||
userAccount: user.account,
|
|
||||||
userPhone: user.phone
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 移除已选择的用户
|
|
||||||
const removeSelectedUser = (user) => {
|
|
||||||
const index = selectedUsers.value.findIndex(selected => selected.userId === user.userId);
|
|
||||||
if (index > -1) {
|
|
||||||
selectedUsers.value.splice(index, 1);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 根据组织ID查询用户列表
|
|
||||||
const getUsersByOrgId = async (orgId) => {
|
|
||||||
// console.log('@@@@@', orgId);
|
|
||||||
try {
|
|
||||||
const res = await request({
|
|
||||||
url: '/snow-ops-platform/user/orgUsers',
|
|
||||||
method: 'GET',
|
|
||||||
params: {
|
|
||||||
orgId
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (res.code === '00000') {
|
|
||||||
currentUsers.value = res.data || [];
|
|
||||||
// console.log('@@@@@', res.data);
|
|
||||||
} else {
|
|
||||||
throw new Error(res.message)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
ElMessage.error('获取用户失败');
|
|
||||||
console.error('获取用户失败:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
getUsersByOrgId(props.orgId);
|
|
||||||
})
|
|
||||||
|
|
||||||
watch(selectedUsers.value, (val) => {
|
|
||||||
props.form.data = val;
|
|
||||||
}, { deep: true })
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.form-part {
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-center {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-select-container {
|
|
||||||
display: flex;
|
|
||||||
gap: 20px;
|
|
||||||
width: 100%;
|
|
||||||
height: 60vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-list-panel {
|
|
||||||
flex: 1;
|
|
||||||
border: 1px solid #dcdfe6;
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: 10px;
|
|
||||||
background-color: #fff;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-panel {
|
|
||||||
flex: 1;
|
|
||||||
border: 1px solid #dcdfe6;
|
|
||||||
border-radius: 4px;
|
|
||||||
padding: 10px;
|
|
||||||
background-color: #fff;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-list {
|
|
||||||
flex: 1;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-item {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
padding: 8px 12px;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
border-radius: 4px;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: all 0.3s;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-item:hover {
|
|
||||||
background-color: #f5f7fa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-item.selected {
|
|
||||||
background-color: #409eff;
|
|
||||||
color: white;
|
|
||||||
border-color: #409eff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-name {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-position {
|
|
||||||
font-size: 12px;
|
|
||||||
opacity: 0.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-user-list {
|
|
||||||
flex: 1;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-user-item {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
padding: 8px 12px;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
border-radius: 4px;
|
|
||||||
background-color: #f0f9ff;
|
|
||||||
border: 1px solid #e1f5fe;
|
|
||||||
gap: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.time-picker-container {
|
|
||||||
flex: 1.2;
|
|
||||||
min-width: 280px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.time-picker-container :deep(.el-date-editor) {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-info {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
min-width: 120px;
|
|
||||||
flex: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-user-item .user-name {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
color: #303133;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-user-item .user-position {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #606266;
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-tree-node {
|
|
||||||
flex: 1;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 14px;
|
|
||||||
padding-right: 8px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -1,224 +0,0 @@
|
|||||||
import { h, ref, onMounted, reactive, watch, toRaw, nextTick } from "vue";
|
|
||||||
import { request } from "@/utils/request";
|
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
|
||||||
import AddDialog from "./addDialog.vue";
|
|
||||||
|
|
||||||
const modelVisible = ref(false); // 弹窗状态
|
|
||||||
const drawerVisible = ref(false); // 抽屉状态
|
|
||||||
// 弹窗内容
|
|
||||||
const model = reactive({
|
|
||||||
|
|
||||||
});
|
|
||||||
const form = reactive({
|
|
||||||
|
|
||||||
});
|
|
||||||
const INIT_FORM = {
|
|
||||||
|
|
||||||
};
|
|
||||||
// 抽屉内容
|
|
||||||
const drawer = reactive({
|
|
||||||
title: '',
|
|
||||||
content: null,
|
|
||||||
props: {},
|
|
||||||
onCancel: null,
|
|
||||||
onConfirm: null,
|
|
||||||
direction: 'rtl',
|
|
||||||
size: '50%'
|
|
||||||
});
|
|
||||||
const dialogRef = ref(null); // 弹窗实例
|
|
||||||
const drawerRef = ref(null); // 抽屉实例
|
|
||||||
|
|
||||||
// 消息推送组织列表(固定六个),增加personList存储该组织的人员数组
|
|
||||||
const messageOrgList = ref([
|
|
||||||
{ title: '中心领导', orgName: '中心领导', personList: [] },
|
|
||||||
{ title: '法规处', orgName: '法规处', personList: [] },
|
|
||||||
{ title: '养护处', orgName: '养护处', personList: [] },
|
|
||||||
{ title: '农村公路处', orgName: '农村公路处', personList: [] },
|
|
||||||
{ title: '建设处', orgName: '建设处', personList: [] },
|
|
||||||
{ title: '市公路应急中心/管理段', orgName: '公路管理段', personList: [] },
|
|
||||||
])
|
|
||||||
|
|
||||||
const messagePushPerson = ref([])
|
|
||||||
const userOrgsList = ref([])
|
|
||||||
|
|
||||||
// 查询所有消息推送人员
|
|
||||||
const getAllMessagePushPerson = async () => {
|
|
||||||
try {
|
|
||||||
const res = await request({
|
|
||||||
url: '/snow-ops-platform/messagePushPerson/listAll',
|
|
||||||
method: 'GET',
|
|
||||||
})
|
|
||||||
if (res.code === '00000') {
|
|
||||||
messagePushPerson.value = res.data
|
|
||||||
|
|
||||||
// 按orgId分组填充人员数据到对应组织
|
|
||||||
messageOrgList.value.forEach(org => {
|
|
||||||
org.personList = messagePushPerson.value.filter(person => person.orgId === org.orgId)
|
|
||||||
});
|
|
||||||
|
|
||||||
// console.log('@@@@@@', messageOrgList.value);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
throw new Error(res.message)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
ElMessage.error('获取消息推送人员失败');
|
|
||||||
console.error('获取消息推送人员失败:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 查询所有组织
|
|
||||||
const getUserOrgs = async () => {
|
|
||||||
try {
|
|
||||||
const res = await request({
|
|
||||||
url: '/snow-ops-platform/user/userOrgs',
|
|
||||||
method: 'GET',
|
|
||||||
})
|
|
||||||
if (res.code === '00000') {
|
|
||||||
userOrgsList.value = res.data.data
|
|
||||||
|
|
||||||
// 遍历后端返回的组织数据,与固定组织列表匹配并赋值orgId
|
|
||||||
messageOrgList.value.forEach(fixedOrg => {
|
|
||||||
const matchedOrg = userOrgsList.value.find(org =>
|
|
||||||
org.orgName === fixedOrg.orgName
|
|
||||||
);
|
|
||||||
if (matchedOrg) {
|
|
||||||
fixedOrg.orgId = matchedOrg.orgId;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 在获取到orgId后,立即根据orgId填充对应的人员数据
|
|
||||||
messageOrgList.value.forEach(org => {
|
|
||||||
org.personList = messagePushPerson.value.filter(person => person.orgId === org.orgId)
|
|
||||||
});
|
|
||||||
|
|
||||||
// console.log('@@@@',messageOrgList.value);
|
|
||||||
} else {
|
|
||||||
throw new Error(res.message)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
ElMessage.error('获取组织失败');
|
|
||||||
console.error('获取组织失败:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 添加消息推送人
|
|
||||||
const handelAdd = async (data) => {
|
|
||||||
try {
|
|
||||||
const loading = ElLoading.service({
|
|
||||||
lock: true,
|
|
||||||
text: '操作中',
|
|
||||||
background: 'rgba(0, 0, 0, 0.7)',
|
|
||||||
})
|
|
||||||
const res = await request({
|
|
||||||
url: '/snow-ops-platform/messagePushPerson/add',
|
|
||||||
method: 'POST',
|
|
||||||
data: data
|
|
||||||
})
|
|
||||||
loading.close();
|
|
||||||
if (res.code === '00000') {
|
|
||||||
ElMessage.success('添加成功');
|
|
||||||
modelVisible.value = false;
|
|
||||||
await getAllMessagePushPerson();
|
|
||||||
} else {
|
|
||||||
throw new Error(res.message)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
ElMessage.error('添加失败');
|
|
||||||
console.error('添加失败:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 打开添加人员弹窗
|
|
||||||
const openAddDialog = (orgId, orgName) => {
|
|
||||||
model.title = '添加人员';
|
|
||||||
Object.assign(form, INIT_FORM);
|
|
||||||
model.props = {
|
|
||||||
orgId: orgId,
|
|
||||||
orgName: orgName,
|
|
||||||
form: form,
|
|
||||||
};
|
|
||||||
model.content = AddDialog;
|
|
||||||
model.onCancel = () => {
|
|
||||||
modelVisible.value = false;
|
|
||||||
};
|
|
||||||
model.onConfirm = async () => {
|
|
||||||
await dialogRef?.value?.dynamicComponentRef?.formRef.validate().then(async () => {
|
|
||||||
// console.log('@@@@@@form',form);
|
|
||||||
await handelAdd(form.data)
|
|
||||||
// await addSchedule(form)
|
|
||||||
// await publishWarning(form)
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
ElMessage.error('请处理表单中的错误项');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
model.width = "70%"
|
|
||||||
modelVisible.value = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 删除消息推送人
|
|
||||||
const deletePushPerson = async (person) => {
|
|
||||||
try {
|
|
||||||
await ElMessageBox.confirm(
|
|
||||||
`确定要删除【${person.realName}】吗?`,
|
|
||||||
'删除确认',
|
|
||||||
{
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
type: 'warning',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
const loading = ElLoading.service({
|
|
||||||
lock: true,
|
|
||||||
text: '操作中',
|
|
||||||
background: 'rgba(0, 0, 0, 0.7)',
|
|
||||||
})
|
|
||||||
const res = await request({
|
|
||||||
url: '/snow-ops-platform/messagePushPerson/deleteByUserId',
|
|
||||||
method: 'POST',
|
|
||||||
data: {
|
|
||||||
userId: person.userId
|
|
||||||
}
|
|
||||||
})
|
|
||||||
loading.close();
|
|
||||||
if (res.code === '00000') {
|
|
||||||
ElMessage.success('删除成功');
|
|
||||||
await getAllMessagePushPerson();
|
|
||||||
} else {
|
|
||||||
throw new Error(res.message)
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
if (error !== 'cancel') {
|
|
||||||
ElMessage.error('删除失败');
|
|
||||||
console.error('删除失败:', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default () => {
|
|
||||||
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
onMounted(async () => {
|
|
||||||
await getUserOrgs();
|
|
||||||
await getAllMessagePushPerson();
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
modelVisible,
|
|
||||||
model,
|
|
||||||
drawerVisible,
|
|
||||||
drawer,
|
|
||||||
dialogRef,
|
|
||||||
drawerRef,
|
|
||||||
openAddDialog,
|
|
||||||
deletePushPerson,
|
|
||||||
|
|
||||||
messageOrgList,
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,121 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="root">
|
|
||||||
<div class="content-box">
|
|
||||||
<el-card shadow="never" v-for="org in script.messageOrgList.value" class="org-box">
|
|
||||||
<template #header>
|
|
||||||
<div class="card-header">
|
|
||||||
<span>{{ org.title }}</span>
|
|
||||||
<el-button type="primary" size="small" text
|
|
||||||
@click="script.openAddDialog(org.orgId, org.orgName)">添加</el-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<!-- 人员列表 -->
|
|
||||||
<div class="person-list">
|
|
||||||
<div v-if="org.personList.length === 0" class="empty-text">暂无人员</div>
|
|
||||||
<div v-else class="person-item" v-for="person in org.personList" :key="person.userId">
|
|
||||||
<div class="person-info">
|
|
||||||
<span class="name">{{ person.realName }}</span>
|
|
||||||
<!-- <span class="account">({{ person.userAccount }})</span> -->
|
|
||||||
<span class="phone" v-if="person.userPhone">{{ person.userPhone }}</span>
|
|
||||||
</div>
|
|
||||||
<el-button type="danger" size="small" text @click="script.deletePushPerson(person)">删除</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-card>
|
|
||||||
</div>
|
|
||||||
<div class="model-box">
|
|
||||||
<MyDialog v-model="script.modelVisible.value" :title="script.model?.title"
|
|
||||||
:dynamicComponent="script.model?.content" :component-props="script.model?.props"
|
|
||||||
:onConfirm="script.model?.onConfirm" :onCancel="script.model?.onCancel" ref="dialogRef"
|
|
||||||
:width="script.model?.width">
|
|
||||||
</MyDialog>
|
|
||||||
<MyDrawer v-model="script.drawerVisible.value" :title="script.drawer?.title"
|
|
||||||
:dynamicComponent="script.drawer?.content" :component-props="script.drawer?.props"
|
|
||||||
:onConfirm="script.drawer?.onConfirm" :onCancel="script.drawer?.onCancel" ref="drawerRef"
|
|
||||||
:direction="script.drawer?.direction" :size="script.drawer?.size">
|
|
||||||
</MyDrawer>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import DynamicTable from "@/component/DynamicTable/index.js";
|
|
||||||
import { Search, ArrowDown } from "@element-plus/icons-vue";
|
|
||||||
import MyDialog from "@/component/MyDialog/index.js";
|
|
||||||
import MyDrawer from "@/component/MyDrawer/index.js";
|
|
||||||
import scriptFn from "./index.js";
|
|
||||||
const script = scriptFn();
|
|
||||||
const { dialogRef, drawerRef } = script;
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.root {
|
|
||||||
height: 100%;
|
|
||||||
padding: 25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-box {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
gap: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.org-box {
|
|
||||||
flex: 1;
|
|
||||||
height: 100%;
|
|
||||||
min-width: fit-content;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
white-space: nowrap;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.person-list {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-text {
|
|
||||||
color: #999;
|
|
||||||
text-align: center;
|
|
||||||
padding: 20px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.person-item {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
padding: 8px 0;
|
|
||||||
border-bottom: 1px solid #f0f0f0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.person-item:last-child {
|
|
||||||
border-bottom: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.person-info {
|
|
||||||
display: flex;
|
|
||||||
gap: 10px;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.name {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.account {
|
|
||||||
color: #666;
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phone {
|
|
||||||
color: #666;
|
|
||||||
font-size: 0.9em;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
Loading…
x
Reference in New Issue
Block a user