## 配置与环境 - .env.example: 更新环境变量配置 - docker-compose.yml: 完善Docker编排配置 - docker/README.md: 更新Docker文档 ## 后端知识库模块 - endpoints/knowledge.py: 增强知识库API端点 - schemas/knowledge.py: 扩展知识库数据模型 - services/knowledge.py: 完善知识库业务逻辑 - config.py: 优化配置管理 - storage/knowledge/.index.json: 更新知识库索引 ## 前端功能 - api.js: 完善API服务层 - knowledge.js: 优化知识库服务 - onlyoffice.js: 新增OnlyOffice文档服务集成 - TopBar.vue: 优化顶部导航栏 - PoliciesView.vue: 完善策略视图 - AppShellRouteView.vue: 新增应用外壳路由视图 - views/scripts/PoliciesView.js: 优化策略脚本 - policiesPreviewFormatters.js: 新增策略预览格式化工具 ## 样式 - policies-view.css: 完善策略页样式 ## 测试 - api-request.test.mjs: API请求测试 - onlyoffice-service.test.mjs: OnlyOffice服务测试 - policies-preview-formatters.test.mjs: 策略预览格式化测试
66 lines
1.5 KiB
JavaScript
66 lines
1.5 KiB
JavaScript
function splitPreviewRow(line) {
|
|
return String(line || '')
|
|
.split('|')
|
|
.map((cell) => cell.trim())
|
|
}
|
|
|
|
export function buildPreviewMetaLine(document) {
|
|
if (!document) {
|
|
return []
|
|
}
|
|
|
|
return [document.summary, document.time].filter(Boolean)
|
|
}
|
|
|
|
export function buildPreviewSecondaryMetaLine(document, page = null) {
|
|
if (!document) {
|
|
return []
|
|
}
|
|
|
|
const activePage = page || (Array.isArray(document.previewPages) ? document.previewPages[0] : null)
|
|
if (!activePage) {
|
|
return []
|
|
}
|
|
|
|
const parts = []
|
|
|
|
if (activePage.subtitle) {
|
|
parts.push(activePage.subtitle)
|
|
}
|
|
|
|
if (document.previewKind === 'table') {
|
|
for (const item of activePage.stats || []) {
|
|
if (!item?.label || !item?.value || item.label === '文件大小') {
|
|
continue
|
|
}
|
|
parts.push(`${item.label} ${item.value}`)
|
|
}
|
|
}
|
|
|
|
return parts
|
|
}
|
|
|
|
export function buildExcelPreviewTable(page) {
|
|
const rawRows = (page?.blocks || [])
|
|
.flatMap((block) => block.lines || [])
|
|
.map(splitPreviewRow)
|
|
.filter((row) => row.length > 0 && row.some((cell) => cell !== ''))
|
|
|
|
if (!rawRows.length) {
|
|
return { headers: [], rows: [] }
|
|
}
|
|
|
|
const columnCount = rawRows.reduce((max, row) => Math.max(max, row.length), 0)
|
|
const normalizedRows = rawRows.map((row) =>
|
|
Array.from({ length: columnCount }, (_, index) => row[index] ?? '')
|
|
)
|
|
|
|
const [headerRow, ...bodyRows] = normalizedRows
|
|
const headers = headerRow.map((cell, index) => cell || `列 ${index + 1}`)
|
|
|
|
return {
|
|
headers,
|
|
rows: bodyRows
|
|
}
|
|
}
|