diff --git a/inventory-web/src/views/stock/inbound/buy.vue b/inventory-web/src/views/stock/inbound/buy.vue index 083ab14..604adb1 100644 --- a/inventory-web/src/views/stock/inbound/buy.vue +++ b/inventory-web/src/views/stock/inbound/buy.vue @@ -957,50 +957,48 @@ const permissionMap: Record = { inspection_report: 'inbound_buy:inspection_report' } -// 初始化列显示状态(移除权限限制,添加 localStorage 支持) +// 初始化列显示状态 const initColumnPermissions = () => { - // 生成存储键:使用用户ID或用户名,如果没有则使用浏览器唯一标识 + // 生成存储键:基于用户 ID 进行隔离,A/B 账号互不干扰 const userId = userStore.user?.id || userStore.username || 'anonymous' const storageKey = `inbound_buy_columns_${userId}` - + // 尝试从 localStorage 读取保存的列配置 const savedColumns = localStorage.getItem(storageKey) if (savedColumns) { try { const parsed = JSON.parse(savedColumns) - // 验证保存的列是否有效(存在于 allColumns 中) - const validColumns = parsed.filter((prop: string) => - allColumns.some(col => col.prop === prop) + // 【核心修复】权限二次交集:缓存的列必须同时满足"存在于 allColumns 且当前拥有该字段权限" + const permittedCols = parsed.filter((prop: string) => + allColumns.some(col => col.prop === prop) && hasColumnPermission(prop) ) - if (validColumns.length > 0) { - visibleColumnProps.value = validColumns + if (permittedCols.length > 0) { + visibleColumnProps.value = permittedCols return } } catch (e) { console.warn('Failed to parse saved columns:', e) } } - - // 如果没有保存的配置,使用默认列 - visibleColumnProps.value = defaultColumns + + // 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示 + visibleColumnProps.value = allColumns + .filter(col => hasColumnPermission(col.prop)) + .map(col => col.prop) } -// 检查列权限(移除权限限制,始终返回 true) +// 检查列权限 const hasColumnPermission = (prop: string) => { - return true + if (userStore.role === 'SUPER_ADMIN' || userStore.username === 'IRIS') { + return true + } + const code = permissionMap[prop] + return code ? userStore.hasPermission(code) : false } const allColumns = [...baseColumns, ...stockColumns] -const defaultColumns = [ - 'company_name', - 'material_name', 'material_type', 'category', 'spec_model', 'unit', - 'inbound_date', 'sn_bn', 'warehouse_loc', 'status', 'inspection_status', - 'tax_rate', 'unit_price', 'total_price', - 'supplier_name', 'purchaser', 'qty_stock', 'qty_available', 'arrival_photo', 'inspection_report' -] - -const visibleColumnProps = ref(defaultColumns) +const visibleColumnProps = ref([]) // 监听列配置变化并保存到 localStorage watch(visibleColumnProps, (newVal) => { diff --git a/inventory-web/src/views/stock/inbound/product.vue b/inventory-web/src/views/stock/inbound/product.vue index 06bfb88..3d5240a 100644 --- a/inventory-web/src/views/stock/inbound/product.vue +++ b/inventory-web/src/views/stock/inbound/product.vue @@ -768,32 +768,34 @@ const permissionMap: Record = { } // 根据用户权限初始化列显示状态 -// 初始化列显示状态(移除权限限制,添加 localStorage 支持) +// 初始化列显示状态 const initColumnPermissions = () => { - // 生成存储键:使用用户ID或用户名,如果没有则使用浏览器唯一标识 + // 生成存储键:基于用户 ID 进行隔离,A/B 账号互不干扰 const userId = userStore.user?.id || userStore.username || 'anonymous' const storageKey = `inbound_product_columns_${userId}` - + // 尝试从 localStorage 读取保存的列配置 const savedColumns = localStorage.getItem(storageKey) if (savedColumns) { try { const parsed = JSON.parse(savedColumns) - // 验证保存的列是否有效(存在于 allColumns 中) - const validColumns = parsed.filter((prop: string) => - allColumns.some(col => col.prop === prop) + // 【核心修复】权限二次交集:缓存的列必须同时满足"存在于 allColumns 且当前拥有该字段权限" + const permittedCols = parsed.filter((prop: string) => + allColumns.some(col => col.prop === prop) && hasColumnPermission(prop) ) - if (validColumns.length > 0) { - visibleColumnProps.value = validColumns + if (permittedCols.length > 0) { + visibleColumnProps.value = permittedCols return } } catch (e) { console.warn('Failed to parse saved columns:', e) } } - - // 如果没有保存的配置,使用默认列 - visibleColumnProps.value = defaultVisibleCols + + // 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示 + visibleColumnProps.value = allColumns + .filter(col => hasColumnPermission(col.prop)) + .map(col => col.prop) } // 检查列权限 @@ -839,7 +841,7 @@ const displayData = computed(() => { }) const defaultVisibleCols = ['company_name', 'material_name', 'sku', 'serial_number', 'qty_stock', 'status', 'quality_status', 'product_photo', 'sale_price', 'order_id'] -const visibleColumnProps = ref(defaultVisibleCols) +const visibleColumnProps = ref([]) // 监听列配置变化并保存到 localStorage watch(visibleColumnProps, (newVal) => { diff --git a/inventory-web/src/views/stock/inbound/semi.vue b/inventory-web/src/views/stock/inbound/semi.vue index 295bdcf..728148d 100644 --- a/inventory-web/src/views/stock/inbound/semi.vue +++ b/inventory-web/src/views/stock/inbound/semi.vue @@ -809,33 +809,34 @@ const stockColumns = [ ] const allColumns = [...baseColumns, ...stockColumns] -// 根据用户权限初始化列显示状态 -// 初始化列显示状态(移除权限限制,添加 localStorage 支持) +// 初始化列显示状态 const initColumnPermissions = () => { - // 生成存储键:使用用户ID或用户名,如果没有则使用浏览器唯一标识 + // 生成存储键:基于用户 ID 进行隔离,A/B 账号互不干扰 const userId = userStore.user?.id || userStore.username || 'anonymous' const storageKey = `inbound_semi_columns_${userId}` - + // 尝试从 localStorage 读取保存的列配置 const savedColumns = localStorage.getItem(storageKey) if (savedColumns) { try { const parsed = JSON.parse(savedColumns) - // 验证保存的列是否有效(存在于 allColumns 中) - const validColumns = parsed.filter((prop: string) => - allColumns.some(col => col.prop === prop) + // 【核心修复】权限二次交集:缓存的列必须同时满足"存在于 allColumns 且当前拥有该字段权限" + const permittedCols = parsed.filter((prop: string) => + allColumns.some(col => col.prop === prop) && hasColumnPermission(prop) ) - if (validColumns.length > 0) { - visibleColumnProps.value = validColumns + if (permittedCols.length > 0) { + visibleColumnProps.value = permittedCols return } } catch (e) { console.warn('Failed to parse saved columns:', e) } } - - // 如果没有保存的配置,使用默认列 - visibleColumnProps.value = defaultColumns + + // 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示 + visibleColumnProps.value = allColumns + .filter(col => hasColumnPermission(col.prop)) + .map(col => col.prop) } // 列与权限Code的映射关系(数据库中的code) @@ -887,7 +888,7 @@ const hasColumnPermission = (prop: string) => { } const defaultColumns = ['company_name', 'material_name', 'spec_model', 'unit', 'inbound_date', 'sn_bn', 'status', 'quality_status', 'bom_code', 'work_order_code', 'qty_stock', 'qty_available', 'unit_total_cost', 'arrival_photo', 'quality_report_link'] -const visibleColumnProps = ref(defaultColumns) +const visibleColumnProps = ref([]) // 监听列配置变化并保存到 localStorage watch(visibleColumnProps, (newVal) => {