From 2421ff666a2f02061e6fca0150839ed1e85fcf0f Mon Sep 17 00:00:00 2001 From: zhutao <1812073942@qq.com> Date: Mon, 15 Dec 2025 18:03:24 +0800 Subject: [PATCH] 1 --- package.json | 1 + pnpm-lock.yaml | 15 +++++++++++++++ src/App.tsx | 28 +++++++++++++++++----------- src/api/common.ts | 9 +++++++++ src/api/service.ts | 2 +- src/types/index.d.ts | 1 + src/utils/common.ts | 14 ++++++++++++++ src/utils/upload/upload.ts | 26 ++++++++++++++++++++++++++ 8 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 src/api/common.ts create mode 100644 src/utils/common.ts create mode 100644 src/utils/upload/upload.ts diff --git a/package.json b/package.json index bc19622..8970fc8 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "axios": "^1.13.2", + "browser-md5-file": "^1.1.1", "immer": "^11.0.1", "lucide-react": "^0.487.0", "motion": "^12.23.26", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c16ad9..e349433 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: axios: specifier: ^1.13.2 version: 1.13.2 + browser-md5-file: + specifier: ^1.1.1 + version: 1.1.1 immer: specifier: ^11.0.1 version: 11.0.1 @@ -426,6 +429,9 @@ packages: axios@1.13.2: resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + browser-md5-file@1.1.1: + resolution: {integrity: sha512-9h2UViTtZPhBa7oHvp5mb7MvJaX5OKEPUsplDwJ800OIV+In7BOR3RXOMB78obn2iQVIiS3WkVLhG7Zu1EMwbw==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -661,6 +667,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + spark-md5@2.0.2: + resolution: {integrity: sha512-9WfT+FYBEvlrOOBEs484/zmbtSX4BlGjzXih1qIEWA1yhHbcqgcMHkiwXoWk2Sq1aJjLpcs6ZKV7JxrDNjIlNg==} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -969,6 +978,10 @@ snapshots: transitivePeerDependencies: - debug + browser-md5-file@1.1.1: + dependencies: + spark-md5: 2.0.2 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -1232,6 +1245,8 @@ snapshots: source-map-js@1.2.1: {} + spark-md5@2.0.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) diff --git a/src/App.tsx b/src/App.tsx index 65a38b9..5616880 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -9,6 +9,7 @@ import toast, {Toaster} from "react-hot-toast"; import wxShare from "@/wx/wxShare"; import {enterpriseAnalyzeApi} from "@/api/service"; import {useUserStore} from "@/store/user-store"; +import {uploadFileQoi} from "@/utils/upload/upload"; export default function App() { const userStore = useUserStore() @@ -27,18 +28,23 @@ export default function App() { * 上传文件 */ const handleUpload = async (file) => { - handleNextScreen() - let res = await enterpriseAnalyzeApi({ - analys_image: file, - analys_type: null, - }) as any - if (res.analysis_result.analyze_ret != "success") { - toast.error("请重新上传结构清晰的组织架构图") - setCurrentScreen(prev => prev = 2) - return + try { + handleNextScreen() + let fileUrl = await uploadFileQoi(file, "/analyze") + let res = await enterpriseAnalyzeApi({ + analys_image: fileUrl, + analys_type: null, + }) as any + if (res.analysis_result.analyze_ret != "success") { + toast.error("请重新上传结构清晰的组织架构图") + setCurrentScreen(prev => prev = 2) + return + } + userStore.setAnalysis(res) + handleNextScreen() + } catch (e) { + setCurrentScreen((prev => prev = 2)) } - userStore.setAnalysis(res) - handleNextScreen() }; const handlePayment = () => { diff --git a/src/api/common.ts b/src/api/common.ts new file mode 100644 index 0000000..2abb2ad --- /dev/null +++ b/src/api/common.ts @@ -0,0 +1,9 @@ +import request from "@/utils/http/request"; + +/** + * 获取七牛token + * @param path + */ +export function getQiuTokenApi(path: string) { + return request.get("/get_qiniu_upload_token", {file_key: path}) +} \ No newline at end of file diff --git a/src/api/service.ts b/src/api/service.ts index dd86835..8dd7b4b 100644 --- a/src/api/service.ts +++ b/src/api/service.ts @@ -2,7 +2,7 @@ import request from "@/utils/http/request"; type EnterpriseAnalyzeApi = { - analys_image: File, + analys_image: string, analys_type: string, } diff --git a/src/types/index.d.ts b/src/types/index.d.ts index b1cc5ec..5933824 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -1,3 +1,4 @@ declare module "weixin-js-sdk" +declare module "browser-md5-file" \ No newline at end of file diff --git a/src/utils/common.ts b/src/utils/common.ts new file mode 100644 index 0000000..98e7b60 --- /dev/null +++ b/src/utils/common.ts @@ -0,0 +1,14 @@ +import BMF from 'browser-md5-file' + +/** + * 获取md5名字 + * @param value + */ +export function getMd5Value(value: any): Promise { + const bmf = new BMF() + return new Promise((resolve) => { + bmf.md5(value, (err: any, md5: string) => { + return resolve(md5) + }) + }) +} \ No newline at end of file diff --git a/src/utils/upload/upload.ts b/src/utils/upload/upload.ts new file mode 100644 index 0000000..c1b9666 --- /dev/null +++ b/src/utils/upload/upload.ts @@ -0,0 +1,26 @@ +import {getMd5Value} from "@/utils/common"; +import {getQiuTokenApi} from "@/api/common"; +import axios from "axios"; + +/** + * 七牛上传文件 + * @param file + * @param path 路径,格式/xx/x + */ +export async function uploadFileQoi(file: File, path: string): Promise { + let uploadOptions = new FormData(); + let md5 = await getMd5Value(file) + let suffix = file.name.split('.')[1] + let res = await getQiuTokenApi("效灵" + path + "/" + md5 + '.' + suffix) as any + uploadOptions.append("token", res.up_token) + uploadOptions.append("upload_url", res.upload_url) + uploadOptions.append("imgPrefix", res.domain) + uploadOptions.append("key", res.file_key) + uploadOptions.append("file", file) + let res2: any = await axios.post(res.upload_url, uploadOptions) + let data = res2.data + if (data.key) { + return `https://${res.domain}/${data.key}` + } + return null +} \ No newline at end of file