fix(frontend): reclassify global cross-company privilege as an operation to fix UI placement, and strictly enforce permission-driven table columns by bypassing localstorage
This commit is contained in:
@ -960,31 +960,8 @@ const permissionMap: Record<string, string> = {
|
|||||||
inspection_report: 'inbound_buy:inspection_report'
|
inspection_report: 'inbound_buy:inspection_report'
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化列显示状态
|
// 初始化列显示状态(纯权限驱动,废除本地缓存)
|
||||||
const initColumnPermissions = () => {
|
const initColumnPermissions = () => {
|
||||||
// 生成存储键:基于用户 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 permittedCols = parsed.filter((prop: string) =>
|
|
||||||
allColumns.some(col => col.prop === prop) && hasColumnPermission(prop)
|
|
||||||
)
|
|
||||||
if (permittedCols.length > 0) {
|
|
||||||
visibleColumnProps.value = permittedCols
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.warn('Failed to parse saved columns:', e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示
|
|
||||||
visibleColumnProps.value = allColumns
|
visibleColumnProps.value = allColumns
|
||||||
.filter(col => hasColumnPermission(col.prop))
|
.filter(col => hasColumnPermission(col.prop))
|
||||||
.map(col => col.prop)
|
.map(col => col.prop)
|
||||||
@ -1003,17 +980,6 @@ const allColumns = [...baseColumns, ...stockColumns]
|
|||||||
|
|
||||||
const visibleColumnProps = ref<string[]>([])
|
const visibleColumnProps = ref<string[]>([])
|
||||||
|
|
||||||
// 监听列配置变化并保存到 localStorage
|
|
||||||
watch(visibleColumnProps, (newVal) => {
|
|
||||||
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
|
||||||
const storageKey = `inbound_buy_columns_${userId}`
|
|
||||||
try {
|
|
||||||
localStorage.setItem(storageKey, JSON.stringify(newVal))
|
|
||||||
} catch (e) {
|
|
||||||
console.warn('Failed to save columns to localStorage:', e)
|
|
||||||
}
|
|
||||||
}, { deep: true })
|
|
||||||
|
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
id: undefined, base_id: undefined as number | undefined,
|
id: undefined, base_id: undefined as number | undefined,
|
||||||
company_name: '',
|
company_name: '',
|
||||||
|
|||||||
@ -780,31 +780,8 @@ const permissionMap: Record<string, string> = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 根据用户权限初始化列显示状态
|
// 根据用户权限初始化列显示状态
|
||||||
// 初始化列显示状态
|
// 初始化列显示状态(纯权限驱动,废除本地缓存)
|
||||||
const initColumnPermissions = () => {
|
const initColumnPermissions = () => {
|
||||||
// 生成存储键:基于用户 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 permittedCols = parsed.filter((prop: string) =>
|
|
||||||
allColumns.some(col => col.prop === prop) && hasColumnPermission(prop)
|
|
||||||
)
|
|
||||||
if (permittedCols.length > 0) {
|
|
||||||
visibleColumnProps.value = permittedCols
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.warn('Failed to parse saved columns:', e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示
|
|
||||||
visibleColumnProps.value = allColumns
|
visibleColumnProps.value = allColumns
|
||||||
.filter(col => hasColumnPermission(col.prop))
|
.filter(col => hasColumnPermission(col.prop))
|
||||||
.map(col => col.prop)
|
.map(col => col.prop)
|
||||||
@ -855,17 +832,6 @@ const displayData = computed(() => {
|
|||||||
const defaultVisibleCols = ['company_name', 'material_name', 'sku', 'serial_number', 'qty_stock', 'status', 'quality_status', 'product_photo', 'sale_price', 'order_id']
|
const defaultVisibleCols = ['company_name', 'material_name', 'sku', 'serial_number', 'qty_stock', 'status', 'quality_status', 'product_photo', 'sale_price', 'order_id']
|
||||||
const visibleColumnProps = ref<string[]>([])
|
const visibleColumnProps = ref<string[]>([])
|
||||||
|
|
||||||
// 监听列配置变化并保存到 localStorage
|
|
||||||
watch(visibleColumnProps, (newVal) => {
|
|
||||||
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
|
||||||
const storageKey = `inbound_product_columns_${userId}`
|
|
||||||
try {
|
|
||||||
localStorage.setItem(storageKey, JSON.stringify(newVal))
|
|
||||||
} catch (e) {
|
|
||||||
console.warn('Failed to save columns to localStorage:', e)
|
|
||||||
}
|
|
||||||
}, { deep: true })
|
|
||||||
|
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
id: undefined, base_id: undefined as number | undefined,
|
id: undefined, base_id: undefined as number | undefined,
|
||||||
company_name: '', // [新增]
|
company_name: '', // [新增]
|
||||||
|
|||||||
@ -811,31 +811,8 @@ const stockColumns = [
|
|||||||
]
|
]
|
||||||
const allColumns = [...baseColumns, ...stockColumns]
|
const allColumns = [...baseColumns, ...stockColumns]
|
||||||
|
|
||||||
// 初始化列显示状态
|
// 初始化列显示状态(纯权限驱动,废除本地缓存)
|
||||||
const initColumnPermissions = () => {
|
const initColumnPermissions = () => {
|
||||||
// 生成存储键:基于用户 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 permittedCols = parsed.filter((prop: string) =>
|
|
||||||
allColumns.some(col => col.prop === prop) && hasColumnPermission(prop)
|
|
||||||
)
|
|
||||||
if (permittedCols.length > 0) {
|
|
||||||
visibleColumnProps.value = permittedCols
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.warn('Failed to parse saved columns:', e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示
|
|
||||||
visibleColumnProps.value = allColumns
|
visibleColumnProps.value = allColumns
|
||||||
.filter(col => hasColumnPermission(col.prop))
|
.filter(col => hasColumnPermission(col.prop))
|
||||||
.map(col => col.prop)
|
.map(col => col.prop)
|
||||||
@ -892,17 +869,6 @@ 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 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<string[]>([])
|
const visibleColumnProps = ref<string[]>([])
|
||||||
|
|
||||||
// 监听列配置变化并保存到 localStorage
|
|
||||||
watch(visibleColumnProps, (newVal) => {
|
|
||||||
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
|
||||||
const storageKey = `inbound_semi_columns_${userId}`
|
|
||||||
try {
|
|
||||||
localStorage.setItem(storageKey, JSON.stringify(newVal))
|
|
||||||
} catch (e) {
|
|
||||||
console.warn('Failed to save columns to localStorage:', e)
|
|
||||||
}
|
|
||||||
}, { deep: true })
|
|
||||||
|
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
id: undefined, base_id: undefined as number | undefined,
|
id: undefined, base_id: undefined as number | undefined,
|
||||||
company_name: '',
|
company_name: '',
|
||||||
|
|||||||
@ -213,7 +213,7 @@ const fetchTree = async () => {
|
|||||||
{
|
{
|
||||||
id: 999991,
|
id: 999991,
|
||||||
name: '跨组织/跨区域数据查询',
|
name: '跨组织/跨区域数据查询',
|
||||||
code: 'global:cross_company',
|
code: 'global:cross_company_op', // 加上 _op 让它显示在操作权限列
|
||||||
type: 'element'
|
type: 'element'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user