feat: implement user-specific column preferences and remove hardcoded defaults in inbound tables
This commit is contained in:
@ -957,9 +957,9 @@ const permissionMap: Record<string, string> = {
|
|||||||
inspection_report: 'inbound_buy:inspection_report'
|
inspection_report: 'inbound_buy:inspection_report'
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化列显示状态(移除权限限制,添加 localStorage 支持)
|
// 初始化列显示状态
|
||||||
const initColumnPermissions = () => {
|
const initColumnPermissions = () => {
|
||||||
// 生成存储键:使用用户ID或用户名,如果没有则使用浏览器唯一标识
|
// 生成存储键:基于用户 ID 进行隔离,A/B 账号互不干扰
|
||||||
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
||||||
const storageKey = `inbound_buy_columns_${userId}`
|
const storageKey = `inbound_buy_columns_${userId}`
|
||||||
|
|
||||||
@ -968,12 +968,12 @@ const initColumnPermissions = () => {
|
|||||||
if (savedColumns) {
|
if (savedColumns) {
|
||||||
try {
|
try {
|
||||||
const parsed = JSON.parse(savedColumns)
|
const parsed = JSON.parse(savedColumns)
|
||||||
// 验证保存的列是否有效(存在于 allColumns 中)
|
// 【核心修复】权限二次交集:缓存的列必须同时满足"存在于 allColumns 且当前拥有该字段权限"
|
||||||
const validColumns = parsed.filter((prop: string) =>
|
const permittedCols = parsed.filter((prop: string) =>
|
||||||
allColumns.some(col => col.prop === prop)
|
allColumns.some(col => col.prop === prop) && hasColumnPermission(prop)
|
||||||
)
|
)
|
||||||
if (validColumns.length > 0) {
|
if (permittedCols.length > 0) {
|
||||||
visibleColumnProps.value = validColumns
|
visibleColumnProps.value = permittedCols
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -981,26 +981,24 @@ const initColumnPermissions = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果没有保存的配置,使用默认列
|
// 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示
|
||||||
visibleColumnProps.value = defaultColumns
|
visibleColumnProps.value = allColumns
|
||||||
|
.filter(col => hasColumnPermission(col.prop))
|
||||||
|
.map(col => col.prop)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查列权限(移除权限限制,始终返回 true)
|
// 检查列权限
|
||||||
const hasColumnPermission = (prop: string) => {
|
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 allColumns = [...baseColumns, ...stockColumns]
|
||||||
|
|
||||||
const defaultColumns = [
|
const visibleColumnProps = ref<string[]>([])
|
||||||
'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)
|
|
||||||
|
|
||||||
// 监听列配置变化并保存到 localStorage
|
// 监听列配置变化并保存到 localStorage
|
||||||
watch(visibleColumnProps, (newVal) => {
|
watch(visibleColumnProps, (newVal) => {
|
||||||
|
|||||||
@ -768,9 +768,9 @@ const permissionMap: Record<string, string> = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 根据用户权限初始化列显示状态
|
// 根据用户权限初始化列显示状态
|
||||||
// 初始化列显示状态(移除权限限制,添加 localStorage 支持)
|
// 初始化列显示状态
|
||||||
const initColumnPermissions = () => {
|
const initColumnPermissions = () => {
|
||||||
// 生成存储键:使用用户ID或用户名,如果没有则使用浏览器唯一标识
|
// 生成存储键:基于用户 ID 进行隔离,A/B 账号互不干扰
|
||||||
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
||||||
const storageKey = `inbound_product_columns_${userId}`
|
const storageKey = `inbound_product_columns_${userId}`
|
||||||
|
|
||||||
@ -779,12 +779,12 @@ const initColumnPermissions = () => {
|
|||||||
if (savedColumns) {
|
if (savedColumns) {
|
||||||
try {
|
try {
|
||||||
const parsed = JSON.parse(savedColumns)
|
const parsed = JSON.parse(savedColumns)
|
||||||
// 验证保存的列是否有效(存在于 allColumns 中)
|
// 【核心修复】权限二次交集:缓存的列必须同时满足"存在于 allColumns 且当前拥有该字段权限"
|
||||||
const validColumns = parsed.filter((prop: string) =>
|
const permittedCols = parsed.filter((prop: string) =>
|
||||||
allColumns.some(col => col.prop === prop)
|
allColumns.some(col => col.prop === prop) && hasColumnPermission(prop)
|
||||||
)
|
)
|
||||||
if (validColumns.length > 0) {
|
if (permittedCols.length > 0) {
|
||||||
visibleColumnProps.value = validColumns
|
visibleColumnProps.value = permittedCols
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -792,8 +792,10 @@ const initColumnPermissions = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果没有保存的配置,使用默认列
|
// 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示
|
||||||
visibleColumnProps.value = defaultVisibleCols
|
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 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<string[]>([])
|
||||||
|
|
||||||
// 监听列配置变化并保存到 localStorage
|
// 监听列配置变化并保存到 localStorage
|
||||||
watch(visibleColumnProps, (newVal) => {
|
watch(visibleColumnProps, (newVal) => {
|
||||||
|
|||||||
@ -809,10 +809,9 @@ const stockColumns = [
|
|||||||
]
|
]
|
||||||
const allColumns = [...baseColumns, ...stockColumns]
|
const allColumns = [...baseColumns, ...stockColumns]
|
||||||
|
|
||||||
// 根据用户权限初始化列显示状态
|
// 初始化列显示状态
|
||||||
// 初始化列显示状态(移除权限限制,添加 localStorage 支持)
|
|
||||||
const initColumnPermissions = () => {
|
const initColumnPermissions = () => {
|
||||||
// 生成存储键:使用用户ID或用户名,如果没有则使用浏览器唯一标识
|
// 生成存储键:基于用户 ID 进行隔离,A/B 账号互不干扰
|
||||||
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
const userId = userStore.user?.id || userStore.username || 'anonymous'
|
||||||
const storageKey = `inbound_semi_columns_${userId}`
|
const storageKey = `inbound_semi_columns_${userId}`
|
||||||
|
|
||||||
@ -821,12 +820,12 @@ const initColumnPermissions = () => {
|
|||||||
if (savedColumns) {
|
if (savedColumns) {
|
||||||
try {
|
try {
|
||||||
const parsed = JSON.parse(savedColumns)
|
const parsed = JSON.parse(savedColumns)
|
||||||
// 验证保存的列是否有效(存在于 allColumns 中)
|
// 【核心修复】权限二次交集:缓存的列必须同时满足"存在于 allColumns 且当前拥有该字段权限"
|
||||||
const validColumns = parsed.filter((prop: string) =>
|
const permittedCols = parsed.filter((prop: string) =>
|
||||||
allColumns.some(col => col.prop === prop)
|
allColumns.some(col => col.prop === prop) && hasColumnPermission(prop)
|
||||||
)
|
)
|
||||||
if (validColumns.length > 0) {
|
if (permittedCols.length > 0) {
|
||||||
visibleColumnProps.value = validColumns
|
visibleColumnProps.value = permittedCols
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -834,8 +833,10 @@ const initColumnPermissions = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果没有保存的配置,使用默认列
|
// 【任务1】废除硬编码默认,动态计算:所有有权限的列默认展示
|
||||||
visibleColumnProps.value = defaultColumns
|
visibleColumnProps.value = allColumns
|
||||||
|
.filter(col => hasColumnPermission(col.prop))
|
||||||
|
.map(col => col.prop)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 列与权限Code的映射关系(数据库中的code)
|
// 列与权限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 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<string[]>([])
|
||||||
|
|
||||||
// 监听列配置变化并保存到 localStorage
|
// 监听列配置变化并保存到 localStorage
|
||||||
watch(visibleColumnProps, (newVal) => {
|
watch(visibleColumnProps, (newVal) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user