|
@@ -94,6 +94,19 @@
|
|
|
:formatter="dateFormatter"
|
|
|
min-width="150"
|
|
|
/>
|
|
|
+ <!-- 字段权限 -->
|
|
|
+ <el-table-column label="字段权限" width="120" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ link
|
|
|
+ @click="openFieldPermissions(scope.row)"
|
|
|
+ :disabled="isSpecialUser(scope.row) || !scope.row.userId"
|
|
|
+ >
|
|
|
+ <Icon icon="ep:key" />配置
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
<!-- 操作列 -->
|
|
|
<el-table-column label="操作" width="100" align="center" fixed="right">
|
|
|
<template #default="scope">
|
|
@@ -130,15 +143,73 @@
|
|
|
<el-button @click="submitForm" type="primary" :loading="loading">提交</el-button>
|
|
|
</template>
|
|
|
</Dialog>
|
|
|
+
|
|
|
+ <!-- 字段权限配置抽屉 -->
|
|
|
+ <el-drawer
|
|
|
+ v-model="fieldPermissionDrawer"
|
|
|
+ title="字段权限配置"
|
|
|
+ size="50%"
|
|
|
+ append-to-body
|
|
|
+ >
|
|
|
+ <template #default>
|
|
|
+ <div class="p-4">
|
|
|
+ <el-alert
|
|
|
+ title="配置字段级权限控制"
|
|
|
+ type="info"
|
|
|
+ description="开启或关闭用户对特定字段的访问权限。"
|
|
|
+ show-icon
|
|
|
+ :closable="false"
|
|
|
+ class="mb-4"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 快速设置按钮组 -->
|
|
|
+ <div class="mb-4 flex gap-2">
|
|
|
+ <el-button type="primary" @click="applyAllPermissions(true)">
|
|
|
+ 全部启用
|
|
|
+ </el-button>
|
|
|
+ <el-button @click="applyAllPermissions(false)">
|
|
|
+ 全部禁用
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 字段权限加载状态 -->
|
|
|
+ <div v-if="fieldLoading" class="flex justify-center items-center py-10">
|
|
|
+ <el-icon class="is-loading"><Loading /></el-icon>
|
|
|
+ <span class="ml-2">正在加载字段信息...</span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 字段权限表格 -->
|
|
|
+ <el-table v-else :data="layerFields" border style="width: 100%">
|
|
|
+ <el-table-column prop="fieldName" label="字段名称" min-width="180" />
|
|
|
+ <el-table-column label="是否启用" width="120" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-switch v-model="scope.row.enabled" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #footer>
|
|
|
+ <div class="flex justify-between items-center">
|
|
|
+ <span class="text-gray-500 text-sm">修改后的权限将在提交时生效</span>
|
|
|
+ <div>
|
|
|
+ <el-button @click="fieldPermissionDrawer = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="saveFieldPermissions">确认</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-drawer>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { GisFormApi } from '@/api/gislayer/gisform/index.ts'
|
|
|
+import { GisFormApi } from '@/api/gislayer/gisform/index'
|
|
|
import * as UserApi from "@/api/system/user";
|
|
|
import { dateFormatter } from "@/utils/formatTime";
|
|
|
import { ref, reactive, onMounted } from "vue";
|
|
|
import { useMessage } from "@/hooks/web/useMessage";
|
|
|
import { ElMessage, ElTable, ElTableColumn } from 'element-plus'
|
|
|
+import { getgisAttr } from "@/api/layer/gisname"; // 导入获取图层属性的API
|
|
|
+import { Loading } from '@element-plus/icons-vue'
|
|
|
|
|
|
/** 图层权限表单 */
|
|
|
defineOptions({ name: 'LayerAuthorityForm' })
|
|
@@ -146,6 +217,12 @@ const message = useMessage() // 消息弹窗
|
|
|
const loading = ref(false) // 列表的加载中
|
|
|
const total = ref(0) // 列表的总页数
|
|
|
|
|
|
+// 字段权限相关接口
|
|
|
+interface FieldPermission {
|
|
|
+ fieldName: string; // 字段名称
|
|
|
+ enabled: boolean; // 是否启用(开/关状态)
|
|
|
+}
|
|
|
+
|
|
|
interface UserRow {
|
|
|
id?: number // 记录ID
|
|
|
userId?: number // 用户ID
|
|
@@ -160,6 +237,7 @@ interface UserRow {
|
|
|
daysLeft?: number // 剩余天数
|
|
|
layer?: string // 图层名称
|
|
|
isDeleted?: boolean // 是否标记为删除(本地状态)
|
|
|
+ fieldPermissions?: Record<string, boolean> // 字段权限(字段名 -> 是否启用)
|
|
|
}
|
|
|
|
|
|
const dialogVisible = ref(false)
|
|
@@ -167,6 +245,13 @@ const list = ref<UserRow[]>([]) // 表格数据
|
|
|
const userOptions = ref<UserApi.UserVO[]>([]) // 用户选项
|
|
|
const deletedUserIds = ref<number[]>([]) // 存储已标记为删除的用户ID
|
|
|
|
|
|
+// 字段权限相关
|
|
|
+const fieldPermissionDrawer = ref(false) // 字段权限抽屉是否可见
|
|
|
+const currentUser = ref<UserRow | null>(null) // 当前正在编辑字段权限的用户
|
|
|
+const layerFields = ref<FieldPermission[]>([]) // 图层字段列表
|
|
|
+const fieldLoading = ref(false) // 字段加载状态
|
|
|
+const currentLayer = ref<string>('') // 当前图层名称
|
|
|
+
|
|
|
const queryParams = reactive({
|
|
|
addUserId: undefined,
|
|
|
layer: undefined,
|
|
@@ -237,6 +322,22 @@ const getList = async () => {
|
|
|
item.onlyRead = 3;
|
|
|
}
|
|
|
|
|
|
+ // 解析字段权限
|
|
|
+ if (item.fieldPermissions) {
|
|
|
+ try {
|
|
|
+ // 如果是字符串,则解析JSON
|
|
|
+ if (typeof item.fieldPermissions === 'string') {
|
|
|
+ item.fieldPermissions = JSON.parse(item.fieldPermissions);
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('解析字段权限失败:', error);
|
|
|
+ item.fieldPermissions = {}; // 使用空对象作为默认值
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 如果没有字段权限,使用空对象
|
|
|
+ item.fieldPermissions = {};
|
|
|
+ }
|
|
|
+
|
|
|
// 更新过期状态和剩余天数
|
|
|
updateExpirationStatus(item);
|
|
|
|
|
@@ -273,12 +374,16 @@ const handleUserChange = (row: UserRow) => {
|
|
|
// 更新过期状态
|
|
|
updateExpirationStatus(row);
|
|
|
}
|
|
|
+
|
|
|
+ // 默认字段权限为空,将在打开字段权限配置时动态加载
|
|
|
+ row.fieldPermissions = {};
|
|
|
}
|
|
|
} else {
|
|
|
// 清空其他字段
|
|
|
row.deptName = undefined
|
|
|
row.mobile = undefined
|
|
|
row.nickname = undefined
|
|
|
+ row.fieldPermissions = undefined
|
|
|
}
|
|
|
updateSubmitData()
|
|
|
}
|
|
@@ -313,6 +418,79 @@ const updateExpirationStatus = (row: UserRow) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// 打开字段权限配置抽屉
|
|
|
+const openFieldPermissions = async (row: UserRow) => {
|
|
|
+ if (!row.userId || !queryParams.layer) return;
|
|
|
+
|
|
|
+ currentUser.value = row;
|
|
|
+ currentLayer.value = queryParams.layer as string;
|
|
|
+ fieldPermissionDrawer.value = true;
|
|
|
+
|
|
|
+ // 加载字段信息
|
|
|
+ fieldLoading.value = true;
|
|
|
+ try {
|
|
|
+ // 从getgisAttr API获取字段列表
|
|
|
+ const fieldList = await getgisAttr(currentLayer.value);
|
|
|
+
|
|
|
+ // 将返回的字段列表处理为我们需要的格式
|
|
|
+ if (fieldList && Array.isArray(fieldList)) {
|
|
|
+ // 如果用户已有字段权限配置,合并现有配置
|
|
|
+ if (row.fieldPermissions) {
|
|
|
+ // 创建新的字段权限列表
|
|
|
+ layerFields.value = fieldList.map(fieldName => ({
|
|
|
+ fieldName,
|
|
|
+ enabled: row.fieldPermissions?.[fieldName] ?? true // 默认启用
|
|
|
+ }));
|
|
|
+ } else {
|
|
|
+ // 如果没有现有配置,所有字段默认启用
|
|
|
+ layerFields.value = fieldList.map(fieldName => ({
|
|
|
+ fieldName,
|
|
|
+ enabled: true
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 如果API返回的不是数组,显示警告
|
|
|
+ layerFields.value = [];
|
|
|
+ message.warning('无法获取图层字段信息');
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取字段信息失败:', error);
|
|
|
+ message.error('获取字段信息失败');
|
|
|
+ layerFields.value = [];
|
|
|
+ } finally {
|
|
|
+ fieldLoading.value = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 批量应用权限设置
|
|
|
+const applyAllPermissions = (enabled: boolean) => {
|
|
|
+ layerFields.value.forEach(field => {
|
|
|
+ field.enabled = enabled;
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+// 保存字段权限配置
|
|
|
+const saveFieldPermissions = () => {
|
|
|
+ if (!currentUser.value) return;
|
|
|
+
|
|
|
+ // 将字段权限列表转换为字段->布尔值的映射
|
|
|
+ const fieldPermissions: Record<string, boolean> = {};
|
|
|
+ layerFields.value.forEach(field => {
|
|
|
+ fieldPermissions[field.fieldName] = field.enabled;
|
|
|
+ });
|
|
|
+
|
|
|
+ // 保存到当前用户
|
|
|
+ currentUser.value.fieldPermissions = fieldPermissions;
|
|
|
+
|
|
|
+ // 关闭抽屉
|
|
|
+ fieldPermissionDrawer.value = false;
|
|
|
+
|
|
|
+ // 更新提交数据
|
|
|
+ updateSubmitData();
|
|
|
+
|
|
|
+ message.success('字段权限配置已保存,将在提交时生效');
|
|
|
+}
|
|
|
+
|
|
|
// 添加行
|
|
|
const handleAddRow = () => {
|
|
|
// 默认7天后过期的日期
|
|
@@ -325,7 +503,8 @@ const handleAddRow = () => {
|
|
|
onlyRead: 3, // 默认只读
|
|
|
valid: true,
|
|
|
daysLeft: 7,
|
|
|
- layer: queryParams.layer
|
|
|
+ layer: queryParams.layer,
|
|
|
+ fieldPermissions: {} // 空字段权限,将在打开字段权限配置时动态加载
|
|
|
};
|
|
|
|
|
|
list.value.push(newRow);
|
|
@@ -363,11 +542,17 @@ const updateSubmitData = () => {
|
|
|
maturityTime = maturityTime.toISOString().substring(0, 19).replace('T', ' ');
|
|
|
}
|
|
|
|
|
|
+ // 字段权限JSON字符串 - 如果存在则序列化,否则使用空对象
|
|
|
+ const fieldPermissionsJson = row.fieldPermissions
|
|
|
+ ? JSON.stringify(row.fieldPermissions)
|
|
|
+ : '{}';
|
|
|
+
|
|
|
return {
|
|
|
userId: row.userId,
|
|
|
maturityTime: maturityTime,
|
|
|
onlyRead: row.onlyRead || 3,
|
|
|
- layer: queryParams.layer
|
|
|
+ layer: queryParams.layer,
|
|
|
+ fieldPermissions: fieldPermissionsJson // 添加字段权限JSON
|
|
|
};
|
|
|
});
|
|
|
|
|
@@ -414,11 +599,17 @@ const submitForm = async () => {
|
|
|
maturityTime = maturityTime.toISOString().substring(0, 19).replace('T', ' ');
|
|
|
}
|
|
|
|
|
|
+ // 字段权限JSON字符串
|
|
|
+ const fieldPermissionsJson = row.fieldPermissions
|
|
|
+ ? JSON.stringify(row.fieldPermissions)
|
|
|
+ : '{}';
|
|
|
+
|
|
|
return {
|
|
|
userId: row.userId,
|
|
|
maturityTime: maturityTime,
|
|
|
onlyRead: row.onlyRead || 3,
|
|
|
- layer: queryParams.layer
|
|
|
+ layer: queryParams.layer,
|
|
|
+ fieldPermissions: fieldPermissionsJson // 添加字段权限JSON
|
|
|
};
|
|
|
});
|
|
|
|