diff --git a/index.html b/index.html index 70ad674..973ca0d 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,9 @@ - + - my-vue-app + 造价计算工具
diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..0b5169c Binary files /dev/null and b/public/favicon.ico differ diff --git a/src/components/ui/button/index.ts b/src/components/ui/button/index.ts index 26e2c55..b1eb116 100644 --- a/src/components/ui/button/index.ts +++ b/src/components/ui/button/index.ts @@ -4,7 +4,7 @@ import { cva } from "class-variance-authority" export { default as Button } from "./Button.vue" export const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", { variants: { variant: { diff --git a/src/components/views/ContractDetailView.vue b/src/components/views/ContractDetailView.vue new file mode 100644 index 0000000..e0c3abb --- /dev/null +++ b/src/components/views/ContractDetailView.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/components/views/Ht.vue b/src/components/views/Ht.vue index 063360b..d5633eb 100644 --- a/src/components/views/Ht.vue +++ b/src/components/views/Ht.vue @@ -1,70 +1,292 @@ \ No newline at end of file + diff --git a/src/components/views/Xm.vue b/src/components/views/Xm.vue index 2c6d8f5..450dda1 100644 --- a/src/components/views/Xm.vue +++ b/src/components/views/Xm.vue @@ -16,7 +16,7 @@ const xmView = markRaw(defineAsyncComponent(() => import('@/components/views/xmI const htView = markRaw(defineAsyncComponent(() => import('@/components/views/Ht.vue'))) const xmCategories = [ - { key: 'info', label: '分类信息', component: xmView }, + { key: 'info', label: '基础信息', component: xmView }, { key: 'contract', label: '合同段管理', component: htView } ] diff --git a/src/components/views/htInfo.vue b/src/components/views/htInfo.vue new file mode 100644 index 0000000..1c3b563 --- /dev/null +++ b/src/components/views/htInfo.vue @@ -0,0 +1,428 @@ + + + + + diff --git a/src/components/views/xmInfo.vue b/src/components/views/xmInfo.vue index 4b93043..8fc0f78 100644 --- a/src/components/views/xmInfo.vue +++ b/src/components/views/xmInfo.vue @@ -2,6 +2,7 @@ import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue' import { AgGridVue } from 'ag-grid-vue3' import type { ColDef, GridOptions } from 'ag-grid-community' +import localforage from 'localforage' import 'ag-grid-enterprise' import { @@ -62,8 +63,6 @@ interface XmInfoState { detailRows: DetailRow[] } -const DB_NAME = 'jgjs-pricing-db' -const DB_STORE = 'form-state' const DB_KEY = 'xm-info-v3' const DEFAULT_PROJECT_NAME = 'xxx造价咨询服务' @@ -282,41 +281,15 @@ const pinnedTopRowData = computed(() => [ } ]) -const openDB = () => - new Promise((resolve, reject) => { - const request = window.indexedDB.open(DB_NAME, 1) - request.onupgradeneeded = () => { - const db = request.result - if (!db.objectStoreNames.contains(DB_STORE)) { - db.createObjectStore(DB_STORE) - } - } - - request.onsuccess = () => resolve(request.result) - request.onerror = () => reject(request.error) - }) const saveToIndexedDB = async () => { try { - const db = await openDB() - const tx = db.transaction(DB_STORE, 'readwrite') - const store = tx.objectStore(DB_STORE) - const payload: XmInfoState = { projectName: projectName.value, - detailRows: detailRows.value + detailRows: JSON.parse(JSON.stringify(detailRows.value)) } - - store.put(payload, DB_KEY) - - await new Promise((resolve, reject) => { - tx.oncomplete = () => resolve() - tx.onerror = () => reject(tx.error) - tx.onabort = () => reject(tx.error) - }) - - db.close() + await localforage.setItem(DB_KEY, payload) } catch (error) { console.error('saveToIndexedDB failed:', error) } @@ -324,24 +297,8 @@ const saveToIndexedDB = async () => { const loadFromIndexedDB = async () => { try { - const db = await openDB() - const tx = db.transaction(DB_STORE, 'readonly') - const store = tx.objectStore(DB_STORE) - const request = store.get(DB_KEY) - - const data = await new Promise((resolve, reject) => { - request.onsuccess = () => resolve(request.result as XmInfoState | undefined) - request.onerror = () => reject(request.error) - }) - - await new Promise((resolve, reject) => { - tx.oncomplete = () => resolve() - tx.onerror = () => reject(tx.error) - tx.onabort = () => reject(tx.error) - }) - - db.close() - + const data = await localforage.getItem(DB_KEY) +console.log(data) if (data) { projectName.value = data.projectName || DEFAULT_PROJECT_NAME detailRows.value = mergeWithDictRows(data.detailRows) @@ -363,24 +320,29 @@ const schedulePersist = () => { }, 250) } -const handleBeforeUnload = () => { - void saveToIndexedDB() -} +// const handleBeforeUnload = () => { +// void saveToIndexedDB() +// } +let gridPersistTimer: ReturnType | null = null const handleCellValueChanged = () => { - schedulePersist() + if (gridPersistTimer) clearTimeout(gridPersistTimer) + gridPersistTimer = setTimeout(() => { + void saveToIndexedDB() + }, 1000) } watch(projectName, schedulePersist) onMounted(async () => { await loadFromIndexedDB() - window.addEventListener('beforeunload', handleBeforeUnload) + // window.addEventListener('beforeunload', handleBeforeUnload) }) onBeforeUnmount(() => { - window.removeEventListener('beforeunload', handleBeforeUnload) + // window.removeEventListener('beforeunload', handleBeforeUnload) if (persistTimer) clearTimeout(persistTimer) + if (gridPersistTimer) clearTimeout(gridPersistTimer) void saveToIndexedDB() }) const processCellForClipboard = (params:any) => { diff --git a/src/components/views/zxFw.vue b/src/components/views/zxFw.vue new file mode 100644 index 0000000..0161f72 --- /dev/null +++ b/src/components/views/zxFw.vue @@ -0,0 +1,377 @@ + + + + + diff --git a/src/layout/tab.vue b/src/layout/tab.vue index 98a4a8b..21a6c56 100644 --- a/src/layout/tab.vue +++ b/src/layout/tab.vue @@ -1,62 +1,387 @@ - - \ No newline at end of file + diff --git a/src/layout/typeLine.vue b/src/layout/typeLine.vue index 89036e6..630c43a 100644 --- a/src/layout/typeLine.vue +++ b/src/layout/typeLine.vue @@ -57,7 +57,7 @@ const activeComponent = computed(() => {