From 9508f1390e7b4ebc82a219fd2d5b8188a2b60ab7 Mon Sep 17 00:00:00 2001 From: wintsa <770775984@qq.com> Date: Wed, 22 Apr 2026 09:40:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Disclaimer(check by 张俊雄&蔡镇喜).docx | Bin 0 -> 39362 bytes HomeHeroBrandTicker.vue | 92 ---- HwzPromoBanner.vue | 75 --- data.js | 117 +++++ index.html | 14 +- package-lock.json | 22 + package.json | 7 +- public/disclaimer.html | 470 ------------------ src/App.vue | 319 +----------- .../app/components/WorkspaceShell.vue | 318 ++++++++++++ .../disclaimer/components/DisclaimerPage.vue | 197 ++++++++ src/i18n/locales/en-US.ts | 43 +- src/i18n/locales/zh-CN.ts | 43 +- src/lib/workspace.ts | 13 +- src/main.ts | 6 +- src/router.ts | 19 + tsconfig.tsbuildinfo | 2 +- 17 files changed, 790 insertions(+), 967 deletions(-) create mode 100644 Budget Tool Disclaimer(check by 张俊雄&蔡镇喜).docx delete mode 100644 HomeHeroBrandTicker.vue delete mode 100644 HwzPromoBanner.vue create mode 100644 data.js delete mode 100644 public/disclaimer.html create mode 100644 src/features/app/components/WorkspaceShell.vue create mode 100644 src/features/disclaimer/components/DisclaimerPage.vue create mode 100644 src/router.ts diff --git a/Budget Tool Disclaimer(check by 张俊雄&蔡镇喜).docx b/Budget Tool Disclaimer(check by 张俊雄&蔡镇喜).docx new file mode 100644 index 0000000000000000000000000000000000000000..73a9ee6778e2c43ba99769db43eab216de336db5 GIT binary patch literal 39362 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 AkZDBoeXd@B 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 literal 0 HcmV?d00001 diff --git a/HomeHeroBrandTicker.vue b/HomeHeroBrandTicker.vue deleted file mode 100644 index 04c185b..0000000 --- a/HomeHeroBrandTicker.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/HwzPromoBanner.vue b/HwzPromoBanner.vue deleted file mode 100644 index 79ce69e..0000000 --- a/HwzPromoBanner.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - diff --git a/data.js b/data.js new file mode 100644 index 0000000..8be6eff --- /dev/null +++ b/data.js @@ -0,0 +1,117 @@ +const DEFAULT_FILE_NAME = 'data' +const DEFAULT_MIME_TYPE = 'application/octet-stream' + +const encoder = new TextEncoder() +const decoder = new TextDecoder() + +const normalizeSuffix = (suffix) => { + const value = String(suffix || '').trim() + if (!value) throw new Error('INVALID_SUFFIX') + return value.startsWith('.') ? value : `.${value}` +} + +const sanitizeFileNamePart = (value) => { + const cleaned = String(value || '') + .replace(/[\\/:*?"<>|]/g, '_') + .replace(/\s+/g, ' ') + .trim() + + return cleaned || DEFAULT_FILE_NAME +} + +const formatTimestamp = (date = new Date()) => { + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const hour = String(date.getHours()).padStart(2, '0') + const minute = String(date.getMinutes()).padStart(2, '0') + const second = String(date.getSeconds()).padStart(2, '0') + + return `${year}${month}${day}-${hour}${minute}${second}` +} + +const encodeData = (data) => { + const json = JSON.stringify(data) + return encoder.encode(json) +} + +const decodeData = (bytes) => { + const text = decoder.decode(bytes) + return JSON.parse(text) +} + +const downloadBlob = (blob, fileName) => { + const url = URL.createObjectURL(blob) + const link = document.createElement('a') + + link.href = url + link.download = fileName + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + URL.revokeObjectURL(url) +} + +const pickFile = (accept) => { + return new Promise((resolve, reject) => { + const input = document.createElement('input') + input.type = 'file' + input.accept = accept + input.style.display = 'none' + + const cleanup = () => { + input.removeEventListener('change', handleChange) + input.remove() + } + + const handleChange = () => { + const file = input.files?.[0] || null + cleanup() + + if (!file) { + reject(new Error('FILE_NOT_SELECTED')) + return + } + + resolve(file) + } + + input.addEventListener('change', handleChange, { once: true }) + document.body.appendChild(input) + input.click() + }) +} + +export const exportData = async (data, suffix, options = {}) => { + const normalizedSuffix = normalizeSuffix(suffix) + const bytes = encodeData(data) + const blob = new Blob([bytes], { + type: options.mimeType || DEFAULT_MIME_TYPE + }) + const baseName = sanitizeFileNamePart(options.fileName) + const fileName = `${baseName}-${formatTimestamp()}${normalizedSuffix}` + const shouldDownload = options.download !== false + + if (shouldDownload) { + downloadBlob(blob, fileName) + } + + return { + blob, + fileName, + bytes + } +} + +export const importData = async (suffix) => { + const normalizedSuffix = normalizeSuffix(suffix) + const file = await pickFile(normalizedSuffix) + const fileName = String(file.name || '') + + if (!fileName.toLowerCase().endsWith(normalizedSuffix.toLowerCase())) { + throw new Error('INVALID_FILE_SUFFIX') + } + + const bytes = new Uint8Array(await file.arrayBuffer()) + return decodeData(bytes) +} diff --git a/index.html b/index.html index 332cdab..7864bef 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,19 @@ - 联众咨询 + 交通运输工程造价咨询服务预算编制规范 + + + + + + + + + + + +
diff --git a/package-lock.json b/package-lock.json index efdf609..ccd4869 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "tailwindcss": "^4.1.18", "vue": "^3.5.25", "vue-i18n": "^11.3.0", + "vue-router": "^4.6.4", "vuedraggable": "^4.1.0" }, "devDependencies": { @@ -2127,6 +2128,27 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, "node_modules/vue-tsc": { "version": "3.2.5", "dev": true, diff --git a/package.json b/package.json index 41ac945..416e4f1 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { - "name": "my-vue-app", + "name": "ZWJJ2026", "private": true, - "version": "0.0.0", + "version": "1.0", "type": "module", "scripts": { "dev": "bunx --bun vite", "build": "bunx vue-tsc -b && bunx --bun vite build", "preview": "bunx --bun vite preview", "type-check": "bunx vue-tsc --noEmit", - "dockerPush":"bun run build && docker build -f Dockerfile.dist -t wintsa/zwzjjstool2026:latest . && docker push wintsa/zwzjjstool2026:latest" + "dockerPush": "bun run build && docker build -f Dockerfile.dist -t wintsa/zwzjjstool2026:latest . && docker push wintsa/zwzjjstool2026:latest" }, "dependencies": { "@ag-grid-community/locale": "^35.1.0", @@ -35,6 +35,7 @@ "tailwindcss": "^4.1.18", "vue": "^3.5.25", "vue-i18n": "^11.3.0", + "vue-router": "^4.6.4", "vuedraggable": "^4.1.0" }, "devDependencies": { diff --git a/public/disclaimer.html b/public/disclaimer.html deleted file mode 100644 index e63f691..0000000 --- a/public/disclaimer.html +++ /dev/null @@ -1,470 +0,0 @@ - - - - - - 预算编制工具免责声明 - - - -
-
-

DISCLAIMER

-

《交通运输工程造价咨询服务预算编制规范》(T/GDHS 017-2026)预算编制工具免责声明

-

最后更新日期:

-

- 感谢您使用本网站提供的《交通运输工程造价咨询服务预算编制规范》(T/GDHS 017-2026)造价咨询服务预算编制工具(以下简称编制工具)(以下简称本工具)。在您使用本工具前,请仔细阅读以下免责声明条款。您继续使用本工具,即视为您已阅读、理解并同意接受本声明的全部内容。 -

-
- -
-

1. 标准依据说明

-

1.1 本工具依据广东省公路学会发布的团体标准《交通运输工程造价咨询服务预算编制规范》(T/GDHS 017-2026)(以下简称本规范)设定的编制方法。使用者应自行判断该标准是否适用于其具体项目及所在地区主管部门的要求。

-

1.2 本工具所依据的规范版本已在工具界面中标注(T/GDHS 017-2026)。如该规范后续发布修订内容、补充规定或被新版本替代,本工具可能无法及时同步更新。使用者有责任在使用前确认所依据的规范版本是否为最新有效版本。

-

1.3 本工具的计算结果基于本规范中的预算编制方法、费用组成及编制规则,但不同地区、不同项目法人对造价咨询服务预算编制的具体要求和计算方法可能存在差异。本工具不保证其计算结果符合任何特定项目或特定主管部门的审核要求。

-
- -
-

2. 计算结果仅供参考

-

本工具所提供的所有计算结果(包括但不限于数值、明细表、汇总报表、编制说明等)均基于您输入的参数(如工程行业、项目规模、咨询类别、工程专业、工作内容、调整系数等)以及本规范中的数学模型与公式自动生成,仅供您参考使用。这些结果不构成任何形式的专业建议,也不代表任何官方或强制性的预算审批依据。

-
- -
-

3. 不保证准确性与完整性

-

尽管我们尽力确保工具的可用性,但本工具按现状和现有基础提供,不附带任何明示或暗示的保证。我们无法保证计算结果在任何情况下均准确、无误或完整。由于数据输入错误、公式取舍、四舍五入或系统延迟等原因,结果可能与实际情况存在偏差。

-
- -
-

4. 用户自行承担风险

-

您应当独立判断计算结果的可信性,并承担将其用于任何决策所产生的全部风险与责任。您不应依赖本工具的编制结果替代专业人士的具体计算或复核。在作出重大决定前,建议您咨询持有交通运输工程造价工程师注册证书的专业人员,或结合项目具体情况进行人工验证与复核。

-
- -
-

5. 责任限制

-

在适用法律允许的最大范围内,本工具的开发方、管理方、发布方及其关联方不对因使用或无法使用本工具而导致的任何直接、间接、偶然、特殊或后果性损失承担法律责任,即使已被告知可能发生此类损失。

-

特别声明:任何造价咨询企业或人员依据本工具计算结果出具的造价咨询成果文件,其质量责任由出具方自行承担。本工具不对任何第三方造价咨询成果的准确性、合规性或引发的任何纠纷承担任何责任。

-
- -
-

6. 服务中断与修改

-

我们保留随时修改、暂停或终止本工具部分或全部功能的权利,且可能不另行通知。对于因技术维护、网络故障、第三方服务中断、规范版本变更等原因导致的工具不可用、数据丢失或计算结果变化,我们不承担责任。

-
- -
-

7. 外部链接与第三方内容

-

如果本工具引用或链接至全国团体标准信息平台、广东省公路学会官网或其他第三方网站,该等链接仅为方便用户查阅规范原文而提供,不代表我们认可其内容的准确性、时效性或完整性。对于任何第三方网站或工具的信息、服务或内容,我们不承担任何责任。

-
- -
-

8. 适用法律

-

本声明的解释、效力及争议解决均适用中华人民共和国法律。若本声明任何条款被认定为无效或不可执行,不影响其余条款的效力。

-
- -
-

用户确认

-

我已阅读、理解并同意本免责声明的全部内容。

-

(勾选后方可继续使用本工具)

- -
- - 返回入口 -
-

勾选后将记录当前浏览器的同意状态,后续从同一受限入口访问时不再重复提示。

-
- - -
-
- - - - diff --git a/src/App.vue b/src/App.vue index afb7b22..7c2aa3f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,320 +1,3 @@ - - diff --git a/src/features/app/components/WorkspaceShell.vue b/src/features/app/components/WorkspaceShell.vue new file mode 100644 index 0000000..1da72e2 --- /dev/null +++ b/src/features/app/components/WorkspaceShell.vue @@ -0,0 +1,318 @@ + + + diff --git a/src/features/disclaimer/components/DisclaimerPage.vue b/src/features/disclaimer/components/DisclaimerPage.vue new file mode 100644 index 0000000..88307a2 --- /dev/null +++ b/src/features/disclaimer/components/DisclaimerPage.vue @@ -0,0 +1,197 @@ + + + diff --git a/src/i18n/locales/en-US.ts b/src/i18n/locales/en-US.ts index ebd451f..5a9b374 100644 --- a/src/i18n/locales/en-US.ts +++ b/src/i18n/locales/en-US.ts @@ -38,7 +38,7 @@ export const enUS = { pickExisting: 'Choose Existing' }, disclaimer: { - link: 'Disclaimer: Go to disclaimer page', + link: 'View Disclaimer', supportText: 'This calculator is provided with free technical support by Zhongwei Engineering Consulting Co., Ltd.' }, dialog: { @@ -56,6 +56,47 @@ export const enUS = { noProjectYet: 'No project available. Create a new project first.' } }, + disclaimerPage: { + documentTitle: 'Budget Tool Disclaimer', + eyebrow: 'DISCLAIMER', + pageTitle: 'Disclaimer for Budget Preparation Tool under (T/GDHS017-2026) Cost Consulting Services for Transportation Engineering as Specifications for Budget Compilation', + lastUpdatedLabel: 'Last updated: ', + lastUpdatedValue: 'April 16, 2026', + leadText: 'Thank you for using the cost consulting budget preparation tool for the Specification for Budget Preparation of Cost Consulting Services for Transportation Engineering (T/GDHS 017-2026) provided on this website. Before using this tool, please read the following disclaimer carefully. By continuing to use this tool, you acknowledge that you have read, understood, and agreed to all terms of this disclaimer.', + sections: { + standardBasisTitle: '1. Standard Basis', + standardBasisP1: '1.1 This tool is based on the methodology set out in the group standard Specification for Budget Preparation of Cost Consulting Services for Transportation Engineering (T/GDHS 017-2026) issued by the Guangdong Province Highway Society "GDHS". Users must independently determine whether the standard applies to their specific projects and the regulatory requirements of their local authorities.', + standardBasisP2: '1.2 The standard version used by this tool is indicated on the interface as T/GDHS 017-2026. Should the standard be subsequently revised, supplemented, or replaced, this tool may not be updated in a timely manner. Users must independently confirm that the referenced version remains the latest valid version before use.', + standardBasisP3: '1.3 The calculation results generated by this tool are based on the budgeting methods, cost structure, and preparation rules in specified the standard. Requirements and calculation approaches may still vary across regions and project owners. This tool does not guarantee that its results will meet the review requirements of any specific project or authority.', + referenceOnlyTitle: '2. Results Are for Reference Only', + referenceOnlyP1: 'All results generated by this tool, including but not limited to values, breakdowns, summaries and preparation instructions, are produced automatically based on the parameters you provide (such as engineering industry, project scale, consulting category, engineering discipline, job responsibilities, adjustment factor, etc.) and the mathematical models and formulas in the standard. They are for reference purposes only and do not constitute professional advice or any official or mandatory basis for budget approval.', + accuracyTitle: '3. No Warranties of Accuracy or Completeness', + accuracyP1: 'Although we make reasonable efforts to ensure the tool\'s availability, it is provided on an as-is basis without any express or implied warranty. We do not guarantee that the results will always be accurate, error-free, or complete. Differences may arise due to input errors, formula selection, rounding, or system delays.', + riskTitle: '4. Users Bear Their Own Risks', + riskP1: 'You should independently assess the reliability of the calculation results and bear all risks and responsibilities arising from any decisions made based thereon. The output of this tool should not replace professional calculation or review. Before making important decisions, you should consult professionals holding a registered certificate in transportation engineering cost or perform manual verification based on the specific project context.', + liabilityTitle: '5. Limitation of Liability', + liabilityP1: 'To the fullest extent permitted by applicable law, the developers, administrators, publishers, and their affiliates shall not be liable for any direct, indirect, accidental, special, or consequential losses arising from the use of or inability to use this tool, even if advised of the possibility of such losses.', + liabilityP2: 'In particular, if any cost consulting enterprise or individual issues deliverables from the results generated by this tool, the issuing party bears sole responsibility for their quality. This tool assumes no responsibility for the accuracy, compliance, or disputes arising from any third-party deliverables.', + interruptionTitle: '6. Service Interruption and Changes', + interruptionP1: 'We reserve the right to modify, suspend, or terminate part or all of this tool at any time, with or without notice. We are not responsible for unavailability, data loss, or changes in calculation results caused by maintenance, network failures, third-party service interruptions, or updates to the standard.', + externalTitle: '7. External Links and Third-Party Content', + externalP1: 'If this tool references or links to the National Group Standards Information Platform, the Guangdong Highway Society website, or other third-party websites, such links are provided only for convenience and do not imply endorsement of their accuracy, timeliness, or completeness. We assume no responsibility for any information, services, or content provided by third parties.', + lawTitle: '8. Governing Law', + lawP1: 'This disclaimer shall be governed by the laws of the People\'s Republic of China. If any provision of this disclaimer is held invalid or unenforceable, the remaining provisions shall remain in effect.' + }, + confirm: { + title: 'User Confirmation', + desc1: 'I have read, understood, and agree to the full contents of this disclaimer.', + desc2: 'You must check the box before continuing to use this tool.', + checkbox: 'I have read, understood, and agree to the full contents of this disclaimer.', + continue: 'Agree and Continue', + hint: 'Once checked, your acceptance will be recorded in this browser so the same restricted entry will not prompt you again.' + }, + actions: { + back: 'Back to Home', + switchLocale: 'Switch Language' + } + }, tab: { toolbar: { light: 'Light', diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts index af9e56f..c826fbd 100644 --- a/src/i18n/locales/zh-CN.ts +++ b/src/i18n/locales/zh-CN.ts @@ -38,7 +38,7 @@ export const zhCN = { pickExisting: '选择已有项目' }, disclaimer: { - link: '免责声明:跳转到免责声明页面', + link: '查看免责声明', supportText: '本计算工具由众为工程咨询有限公司提供免费技术支持' }, dialog: { @@ -56,6 +56,47 @@ export const zhCN = { noProjectYet: '当前暂无可进入的项目,请先新建项目。' } }, + disclaimerPage: { + documentTitle: '预算编制工具免责声明', + eyebrow: 'DISCLAIMER', + pageTitle: '《交通运输工程造价咨询服务预算编制规范》(T/GDHS 017-2026)预算编制工具免责声明', + lastUpdatedLabel: '最后更新日期:', + lastUpdatedValue: '2026年04月16日', + leadText: '感谢您使用本网站提供的《交通运输工程造价咨询服务预算编制规范》(T/GDHS 017-2026)造价咨询服务预算编制工具。在您使用本工具前,请仔细阅读以下免责声明条款。您继续使用本工具,即视为您已阅读、理解并同意接受本声明的全部内容。', + sections: { + standardBasisTitle: '1. 标准依据说明', + standardBasisP1: '1.1 本工具依据广东省公路学会发布的团体标准《交通运输工程造价咨询服务预算编制规范》(T/GDHS 017-2026)设定编制方法。使用者应自行判断该标准是否适用于其具体项目及所在地主管部门要求。', + standardBasisP2: '1.2 本工具所依据的规范版本已在工具界面标注为 T/GDHS 017-2026。如该规范后续发布修订内容、补充规定或被新版本替代,本工具可能无法及时同步更新。使用者有责任在使用前确认所依据规范是否仍为最新有效版本。', + standardBasisP3: '1.3 本工具的计算结果基于本规范中的预算编制方法、费用组成及编制规则,但不同地区、不同项目法人对造价咨询服务预算编制的具体要求和计算方法可能存在差异。本工具不保证其计算结果符合任何特定项目或特定主管部门的审核要求。', + referenceOnlyTitle: '2. 计算结果仅供参考', + referenceOnlyP1: '本工具所提供的所有计算结果,包括但不限于数值、明细表、汇总报表及编制说明,均基于您输入的参数(如工程行业、项目规模、咨询类别、工程专业、工作内容、调整系数等)以及本规范中的数学模型与公式自动生成,仅供参考使用。这些结果不构成任何形式的专业建议,也不代表任何官方或强制性的预算审批依据。', + accuracyTitle: '3. 不保证准确性与完整性', + accuracyP1: '尽管我们尽力确保本工具可用,但本工具按现状提供,不附带任何明示或暗示的保证。我们无法保证计算结果在任何情况下均准确、无误或完整。由于数据输入错误、公式取舍、四舍五入或系统延迟等原因,结果可能与实际情况存在偏差。', + riskTitle: '4. 用户自行承担风险', + riskP1: '您应独立判断计算结果的可信性,并承担将其用于任何决策所产生的全部风险与责任。您不应依赖本工具替代专业人士的具体计算或复核。在作出重大决定前,建议咨询持有交通运输工程造价工程师注册证书的专业人员,或结合项目具体情况进行人工验证与复核。', + liabilityTitle: '5. 责任限制', + liabilityP1: '在适用法律允许的最大范围内,本工具的开发方、管理方、发布方及其关联方,不对因使用或无法使用本工具而导致的任何直接、间接、偶然、特殊或后果性损失承担法律责任,即使已被告知可能发生此类损失。', + liabilityP2: '特别声明:任何造价咨询企业或个人依据本工具计算结果出具的成果文件,其质量责任由出具方自行承担。本工具不对任何第三方成果文件的准确性、合规性或由此引发的争议承担责任。', + interruptionTitle: '6. 服务中断与修改', + interruptionP1: '我们保留随时修改、暂停或终止本工具部分或全部功能的权利,且可能不另行通知。对于因技术维护、网络故障、第三方服务中断、规范版本变更等原因导致的工具不可用、数据丢失或计算结果变化,我们不承担责任。', + externalTitle: '7. 外部链接与第三方内容', + externalP1: '如果本工具引用或链接至全国团体标准信息平台、广东省公路学会官网或其他第三方网站,该等链接仅为方便用户查阅规范原文而提供,不代表我们认可其内容的准确性、时效性或完整性。对于任何第三方网站或工具的信息、服务或内容,我们不承担责任。', + lawTitle: '8. 适用法律', + lawP1: '本声明的解释、效力及争议解决均适用中华人民共和国法律。若本声明任何条款被认定为无效或不可执行,不影响其余条款的效力。' + }, + confirm: { + title: '用户确认', + desc1: '我已阅读、理解并同意本免责声明的全部内容。', + desc2: '勾选后方可继续使用本工具。', + checkbox: '我已阅读、理解并同意本免责声明的全部内容。', + continue: '同意并继续', + hint: '勾选后将记录当前浏览器的同意状态,后续从同一受限入口访问时不再重复提示。' + }, + actions: { + back: '返回入口', + switchLocale: '切换语言' + } + }, tab: { toolbar: { light: '浅色', diff --git a/src/lib/workspace.ts b/src/lib/workspace.ts index 078b4b7..b99d584 100644 --- a/src/lib/workspace.ts +++ b/src/lib/workspace.ts @@ -282,13 +282,18 @@ export const consumePendingDisclaimerAction = () => { export const buildDisclaimerUrl = (returnUrl?: string) => { try { - const url = new URL('disclaimer.html', window.location.href) + const url = new URL(window.location.href) + const target = new URL(`${url.pathname}${url.search}`, url.origin) if (returnUrl) { - url.searchParams.set(DISCLAIMER_RETURN_URL_QUERY_KEY, returnUrl) + target.hash = `#/disclaimer?${new URLSearchParams({ + [DISCLAIMER_RETURN_URL_QUERY_KEY]: returnUrl + }).toString()}` + } else { + target.hash = '#/disclaimer' } - return url.toString() + return target.toString() } catch { - return './disclaimer.html' + return './#/disclaimer' } } diff --git a/src/main.ts b/src/main.ts index 12174fe..a2e5877 100644 --- a/src/main.ts +++ b/src/main.ts @@ -28,6 +28,7 @@ import { i18n } from '@/i18n' import { ensureProjectIdInUrl, getProjectDbName } from '@/lib/workspace' import { listProjects } from '@/lib/projectRegistry' import { collectActiveProjectSessionLocks } from '@/lib/projectSessionLock' +import { router } from '@/router' LicenseManager.setLicenseKey( '[v3][RELEASE][0102]_NDg2Njc4MzY3MDgzNw==16d78ca762fb5d2ff740aed081e2af7b' @@ -52,7 +53,10 @@ const AG_GRID_MODULES = [ LocaleModule,ValidationModule ,CellSpanModule ,RowStyleModule ,RowSelectionModule ,ServerSideRowModelApiModule ] +const isDisclaimerRoute = () => String(window.location.hash || '').startsWith('#/disclaimer') + const pickBootstrapProjectId = () => { + if (isDisclaimerRoute()) return 'default' try { const url = new URL(window.location.href) @@ -87,4 +91,4 @@ uiPrefsStore.initFromStorage() // 在应用启动时一次性注册 AG Grid 运行所需模块。 ModuleRegistry.registerModules(AG_GRID_MODULES) -createApp(App).use(pinia).use(i18n).mount('#app') +createApp(App).use(pinia).use(i18n).use(router).mount('#app') diff --git a/src/router.ts b/src/router.ts new file mode 100644 index 0000000..93bfd1f --- /dev/null +++ b/src/router.ts @@ -0,0 +1,19 @@ +import { createRouter, createWebHashHistory } from 'vue-router' +import DisclaimerPage from '@/features/disclaimer/components/DisclaimerPage.vue' +import WorkspaceShell from '@/features/app/components/WorkspaceShell.vue' + +export const router = createRouter({ + history: createWebHashHistory(), + routes: [ + { + path: '/', + name: 'workspace', + component: WorkspaceShell + }, + { + path: '/disclaimer', + name: 'disclaimer', + component: DisclaimerPage + } + ] +}) diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index 3e84f5f..eff87c1 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/main.ts","./src/sql.ts","./src/components/ui/button/index.ts","./src/components/ui/card/index.ts","./src/components/ui/scroll-area/index.ts","./src/components/ui/tooltip/index.ts","./src/features/ht/contracts.ts","./src/features/ht/importexport.ts","./src/features/ht/types.ts","./src/features/tab/importexport.ts","./src/features/tab/types.ts","./src/i18n/dictionary-en.ts","./src/i18n/index.ts","./src/i18n/locales/en-us.ts","./src/i18n/locales/zh-cn.ts","./src/lib/aggridreadonlyautoheight.ts","./src/lib/aggridresetheader.ts","./src/lib/contractsegment.ts","./src/lib/decimal.ts","./src/lib/diyaggridoptions.ts","./src/lib/number.ts","./src/lib/numberformat.ts","./src/lib/pricinghourlycalc.ts","./src/lib/pricingmethodtotals.ts","./src/lib/pricingpersistcontrol.ts","./src/lib/pricingpinnedrows.ts","./src/lib/pricingscalecalc.ts","./src/lib/pricingscalecolumns.ts","./src/lib/pricingscaledetail.ts","./src/lib/pricingscaledict.ts","./src/lib/pricingscalefee.ts","./src/lib/pricingscalegrid.ts","./src/lib/pricingscalelink.ts","./src/lib/pricingscalepanedata.ts","./src/lib/pricingscalepanelifecycle.ts","./src/lib/pricingscaleproject.ts","./src/lib/pricingscalerowmap.ts","./src/lib/pricingworkloadcalc.ts","./src/lib/projectevents.ts","./src/lib/projectkvstore.ts","./src/lib/projectregistry.ts","./src/lib/projectsessionlock.ts","./src/lib/projectworkspace.ts","./src/lib/reportexportbuilders.ts","./src/lib/servicepricing.ts","./src/lib/utils.ts","./src/lib/workspace.ts","./src/lib/xmfactordefaults.ts","./src/lib/zwarchive.ts","./src/lib/zxfwpricingsync.ts","./src/pinia/kv.ts","./src/pinia/tab.ts","./src/pinia/uiprefs.ts","./src/pinia/zxfwpricing.ts","./src/pinia/zxfwpricinghtfee.ts","./src/pinia/zxfwpricingkeys.ts","./src/pinia/plugin/indexdb.ts","./src/pinia/plugin/types.d.ts","./src/types/pricing.ts","./src/app.vue","./src/components/ui/button/button.vue","./src/components/ui/card/card.vue","./src/components/ui/card/cardaction.vue","./src/components/ui/card/cardcontent.vue","./src/components/ui/card/carddescription.vue","./src/components/ui/card/cardfooter.vue","./src/components/ui/card/cardheader.vue","./src/components/ui/card/cardtitle.vue","./src/components/ui/scroll-area/scrollarea.vue","./src/components/ui/scroll-area/scrollbar.vue","./src/components/ui/tooltip/tooltipcontent.vue","./src/features/ht/components/ht.vue","./src/features/ht/components/htadditionalworkfee.vue","./src/features/ht/components/htbaseinfo.vue","./src/features/ht/components/htconsultcategoryfactor.vue","./src/features/ht/components/htcontractsummary.vue","./src/features/ht/components/htfeeratemethodform.vue","./src/features/ht/components/htmajorfactor.vue","./src/features/ht/components/htreservefee.vue","./src/features/ht/components/htcard.vue","./src/features/ht/components/htinfo.vue","./src/features/ht/components/zxfw.vue","./src/features/pricing/components/hourlypricingpane.vue","./src/features/pricing/components/investmentscalepricingpane.vue","./src/features/pricing/components/landscalepricingpane.vue","./src/features/pricing/components/scaleformulareadonlypane.vue","./src/features/pricing/components/workloadpricingpane.vue","./src/features/shared/components/hourlyfeegrid.vue","./src/features/shared/components/htfeegrid.vue","./src/features/shared/components/htfeemethodgrid.vue","./src/features/shared/components/methodunavailablenotice.vue","./src/features/shared/components/servicecheckboxselector.vue","./src/features/shared/components/workcontentgrid.vue","./src/features/shared/components/xmfactorgrid.vue","./src/features/shared/components/xmcommonaggrid.vue","./src/features/workbench/components/homeentryview.vue","./src/features/workbench/components/htfeemethodtypelineview.vue","./src/features/workbench/components/quickcalcworkbenchview.vue","./src/features/workbench/components/zxfwview.vue","./src/features/xm/components/xmconsultcategoryfactor.vue","./src/features/xm/components/xmmajorfactor.vue","./src/features/xm/components/info.vue","./src/features/xm/components/xmcard.vue","./src/features/xm/components/xminfo.vue","./src/layout/tab.vue","./src/layout/typeline.vue"],"version":"5.9.3"} \ No newline at end of file +{"root":["./src/main.ts","./src/router.ts","./src/sql.ts","./src/components/ui/button/index.ts","./src/components/ui/card/index.ts","./src/components/ui/scroll-area/index.ts","./src/components/ui/tooltip/index.ts","./src/features/ht/contracts.ts","./src/features/ht/importexport.ts","./src/features/ht/types.ts","./src/features/tab/importexport.ts","./src/features/tab/types.ts","./src/i18n/dictionary-en.ts","./src/i18n/index.ts","./src/i18n/locales/en-us.ts","./src/i18n/locales/zh-cn.ts","./src/lib/aggridreadonlyautoheight.ts","./src/lib/aggridresetheader.ts","./src/lib/contractsegment.ts","./src/lib/decimal.ts","./src/lib/diyaggridoptions.ts","./src/lib/number.ts","./src/lib/numberformat.ts","./src/lib/pricinghourlycalc.ts","./src/lib/pricingmethodtotals.ts","./src/lib/pricingpersistcontrol.ts","./src/lib/pricingpinnedrows.ts","./src/lib/pricingscalecalc.ts","./src/lib/pricingscalecolumns.ts","./src/lib/pricingscaledetail.ts","./src/lib/pricingscaledict.ts","./src/lib/pricingscalefee.ts","./src/lib/pricingscalegrid.ts","./src/lib/pricingscalelink.ts","./src/lib/pricingscalepanedata.ts","./src/lib/pricingscalepanelifecycle.ts","./src/lib/pricingscaleproject.ts","./src/lib/pricingscalerowmap.ts","./src/lib/pricingworkloadcalc.ts","./src/lib/projectevents.ts","./src/lib/projectkvstore.ts","./src/lib/projectregistry.ts","./src/lib/projectsessionlock.ts","./src/lib/projectworkspace.ts","./src/lib/reportexportbuilders.ts","./src/lib/servicepricing.ts","./src/lib/utils.ts","./src/lib/workspace.ts","./src/lib/xmfactordefaults.ts","./src/lib/zwarchive.ts","./src/lib/zxfwpricingsync.ts","./src/pinia/kv.ts","./src/pinia/tab.ts","./src/pinia/uiprefs.ts","./src/pinia/zxfwpricing.ts","./src/pinia/zxfwpricinghtfee.ts","./src/pinia/zxfwpricingkeys.ts","./src/pinia/plugin/indexdb.ts","./src/pinia/plugin/types.d.ts","./src/types/pricing.ts","./src/app.vue","./src/components/ui/button/button.vue","./src/components/ui/card/card.vue","./src/components/ui/card/cardaction.vue","./src/components/ui/card/cardcontent.vue","./src/components/ui/card/carddescription.vue","./src/components/ui/card/cardfooter.vue","./src/components/ui/card/cardheader.vue","./src/components/ui/card/cardtitle.vue","./src/components/ui/scroll-area/scrollarea.vue","./src/components/ui/scroll-area/scrollbar.vue","./src/components/ui/tooltip/tooltipcontent.vue","./src/features/app/components/workspaceshell.vue","./src/features/disclaimer/components/disclaimerpage.vue","./src/features/ht/components/ht.vue","./src/features/ht/components/htadditionalworkfee.vue","./src/features/ht/components/htbaseinfo.vue","./src/features/ht/components/htconsultcategoryfactor.vue","./src/features/ht/components/htcontractsummary.vue","./src/features/ht/components/htfeeratemethodform.vue","./src/features/ht/components/htmajorfactor.vue","./src/features/ht/components/htreservefee.vue","./src/features/ht/components/htcard.vue","./src/features/ht/components/htinfo.vue","./src/features/ht/components/zxfw.vue","./src/features/pricing/components/hourlypricingpane.vue","./src/features/pricing/components/investmentscalepricingpane.vue","./src/features/pricing/components/landscalepricingpane.vue","./src/features/pricing/components/scaleformulareadonlypane.vue","./src/features/pricing/components/workloadpricingpane.vue","./src/features/shared/components/hourlyfeegrid.vue","./src/features/shared/components/htfeegrid.vue","./src/features/shared/components/htfeemethodgrid.vue","./src/features/shared/components/methodunavailablenotice.vue","./src/features/shared/components/servicecheckboxselector.vue","./src/features/shared/components/workcontentgrid.vue","./src/features/shared/components/xmfactorgrid.vue","./src/features/shared/components/xmcommonaggrid.vue","./src/features/workbench/components/homeentryview.vue","./src/features/workbench/components/htfeemethodtypelineview.vue","./src/features/workbench/components/quickcalcworkbenchview.vue","./src/features/workbench/components/zxfwview.vue","./src/features/xm/components/xmconsultcategoryfactor.vue","./src/features/xm/components/xmmajorfactor.vue","./src/features/xm/components/info.vue","./src/features/xm/components/xmcard.vue","./src/features/xm/components/xminfo.vue","./src/layout/tab.vue","./src/layout/typeline.vue"],"version":"5.9.3"} \ No newline at end of file