恢复点(restore point)。别人改崩后可 git reset --hard 回到此提交。 == 此快照内容 == - 后端 oa-backend: 734 控制器 / 711 实体 (Spring Boot 3.2.5 + SQLite, 端口8091) - 前端 modern-ui/app: Vue3+Vite, 约700页 (构建产物已在 oa-backend/src/main/resources/static) - 数据库 oa-backend/data/oa.db: 含全部演示数据 (强制入库, 6.6MB) - 交接文档 go.md + go-code-reference/endpoints/entities/database.md - 多代理建设脚本 .claude/wf-*.js == 状态 == - 对 凯迪科技ERP_20260507.xlsx 合规 MET ~73.3% (PARTIAL 75: 34可建+6种子/bug+35外部硬天花板) - 安全: 5轮红队+5轮复检, default-deny分级鉴权, 连续零可利用 - W3~W7 累计补完436缺口; W8末轮(40缺口)为半成品(源码树可编译但未集成) - 运行: cd oa-backend; java -jar build/libs/oa-backend-0.1.0.jar --server.port=8091; admin/123456 == 排除(gitignore, 可再生) == node_modules / oa-backend/build / .jdks / *.log / Backup-ERP-* / 弃用的OFBiz核心(只保留modern-ui) 完整文件夹备份见同目录 Backup-ERP-20260615-191517/ (含上述全部, 仅缺 node_modules) 时间戳: 20260615-191517 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
81 lines
2.8 KiB
TypeScript
81 lines
2.8 KiB
TypeScript
import { defineConfig } from 'vite'
|
|
import vue from '@vitejs/plugin-vue'
|
|
|
|
const chunkSizeWarningLimit = 850
|
|
|
|
function chunkGroup(id: string) {
|
|
const normalizedId = id.replaceAll('\\', '/')
|
|
if (normalizedId.includes('/node_modules/')) {
|
|
// Heavy, self-contained leaf libs (no Vue import) — isolate so they don't
|
|
// bloat the main vendor chunk. Pure parsers, zero cross-chunk init-order risk.
|
|
if (normalizedId.includes('/node_modules/pdfjs-dist/')) {
|
|
return 'vendor-pdfjs'
|
|
}
|
|
if (normalizedId.includes('/node_modules/xlsx/')) {
|
|
return 'vendor-xlsx'
|
|
}
|
|
if (normalizedId.includes('/node_modules/mammoth/')) {
|
|
return 'vendor-mammoth'
|
|
}
|
|
// Element Plus + its icons depend on Vue one-way (no circular) — proven safe
|
|
// to keep as their own cacheable chunks.
|
|
if (normalizedId.includes('/node_modules/@element-plus/icons-vue/')) {
|
|
return 'vendor-element-icons'
|
|
}
|
|
if (normalizedId.includes('/node_modules/element-plus/')) {
|
|
return 'vendor-element-plus'
|
|
}
|
|
// vue + @vue + EVERY Vue-coupled lib (tiptap / prosemirror / yjs /
|
|
// vuedraggable / sortablejs ...) MUST share one chunk. Splitting Vue into its
|
|
// own `vendor-vue` chunk let those libs evaluate before Vue finished
|
|
// initializing, throwing a cross-chunk TDZ at runtime:
|
|
// "ReferenceError: Cannot access 'W' before initialization" → blank page.
|
|
// Circular deps WITHIN a single chunk are hoisted correctly by Rollup.
|
|
return 'vendor'
|
|
}
|
|
if (normalizedId.includes('/src/components/erp/ErpPageRenderer.vue')) {
|
|
return 'erp-page-renderer'
|
|
}
|
|
if (normalizedId.includes('/src/components/erp/')) {
|
|
return 'erp-components'
|
|
}
|
|
}
|
|
|
|
export default defineConfig({
|
|
plugins: [vue()],
|
|
base: '/',
|
|
server: {
|
|
port: 5175,
|
|
proxy: {
|
|
// OA backend (Java / Spring Boot). All OA calls live under /api/oa/*.
|
|
// Proxying keeps the browser same-origin in dev, so no CORS is needed.
|
|
'/api': {
|
|
target: 'http://localhost:8090',
|
|
changeOrigin: true,
|
|
secure: false
|
|
},
|
|
// Real-time collaboration WebSocket (yjs CRDT relay). ws:true upgrades the
|
|
// connection so /ws/collab/{docId} reaches the backend in dev too.
|
|
'/ws': {
|
|
target: 'ws://localhost:8090',
|
|
ws: true,
|
|
changeOrigin: true
|
|
}
|
|
}
|
|
},
|
|
build: {
|
|
// Single-deployable: build straight into the Spring Boot backend's static
|
|
// resources, so `gradlew bootJar` then bundles the SPA into the one runnable jar
|
|
// (served on the same port as the API — no separate vite / proxy / CORS).
|
|
outDir: '../../../../oa-backend/src/main/resources/static',
|
|
assetsDir: 'assets',
|
|
emptyOutDir: true,
|
|
chunkSizeWarningLimit,
|
|
rollupOptions: {
|
|
output: {
|
|
manualChunks: chunkGroup
|
|
}
|
|
}
|
|
}
|
|
})
|