From 6dea270641aba2918e479deaf16f68d85ab2db45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BA=E7=8B=A8?= <18119604035@163.com> Date: Wed, 8 Mar 2023 11:40:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=A6=E5=91=98=E6=89=B9=E9=87=8F=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 178 +++++++++++++++++++++++++++- package.json | 3 +- src/api/user.ts | 2 +- src/pages/index.ts | 1 + src/pages/member/import.module.less | 0 src/pages/member/import.tsx | 86 ++++++++++++++ src/pages/member/index.tsx | 5 + src/router/routes.tsx | 8 +- 8 files changed, 278 insertions(+), 5 deletions(-) create mode 100644 src/pages/member/import.module.less create mode 100644 src/pages/member/import.tsx diff --git a/package-lock.json b/package-lock.json index ed0382d..70c8bb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,7 +77,8 @@ "webpack": "^5.64.4", "webpack-dev-server": "^4.6.0", "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" + "workbox-webpack-plugin": "^6.4.1", + "xlsjs": "^1.0.1" } }, "node_modules/@adobe/css-tools": { @@ -4738,6 +4739,14 @@ "node": ">=8.9" } }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", @@ -5733,6 +5742,18 @@ "node": ">=4" } }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", @@ -5965,6 +5986,14 @@ "node": ">=4" } }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -6235,6 +6264,17 @@ "node": ">=10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8615,6 +8655,14 @@ "node": ">= 0.6" } }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz", @@ -15687,6 +15735,17 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", @@ -17376,6 +17435,22 @@ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", "peer": true }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", @@ -17762,6 +17837,38 @@ } } }, + "node_modules/xlsjs": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/xlsjs/-/xlsjs-1.0.1.tgz", + "integrity": "sha512-nHQw6je2wd/xcO2ZLsJ72YakfBavrTU8D4B+tGwhJQU5GNkwYlsvvADYfxVGu99R/TJUQDQojCOKPOkWZiUuTg==", + "deprecated": "xlsjs has been merged into xlsx", + "dependencies": { + "xlsx": "" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -20891,6 +20998,11 @@ "regex-parser": "^2.2.11" } }, + "adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", @@ -21584,6 +21696,15 @@ "resolved": "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==" }, + "cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "requires": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", @@ -21739,6 +21860,11 @@ } } }, + "codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==" + }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -21936,6 +22062,11 @@ "yaml": "^1.10.0" } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -23542,6 +23673,11 @@ "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" + }, "fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz", @@ -28126,6 +28262,14 @@ "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "requires": { + "frac": "~1.1.2" + } + }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", @@ -29259,6 +29403,16 @@ "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", "peer": true }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==" + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", @@ -29566,6 +29720,28 @@ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "requires": {} }, + "xlsjs": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/xlsjs/-/xlsjs-1.0.1.tgz", + "integrity": "sha512-nHQw6je2wd/xcO2ZLsJ72YakfBavrTU8D4B+tGwhJQU5GNkwYlsvvADYfxVGu99R/TJUQDQojCOKPOkWZiUuTg==", + "requires": { + "xlsx": "" + } + }, + "xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "requires": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + } + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz", diff --git a/package.json b/package.json index fdf55fc..d442899 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,8 @@ "webpack": "^5.64.4", "webpack-dev-server": "^4.6.0", "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" + "workbox-webpack-plugin": "^6.4.1", + "xlsjs": "^1.0.1" }, "scripts": { "start": "node scripts/start.js", diff --git a/src/api/user.ts b/src/api/user.ts index a644ef9..c359a69 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -75,7 +75,7 @@ export function destroyUser(id: number) { //startline是表格真是数据的起始行号-用于提示哪一行数据存在问题 //users是一个二维字符串数组,每个数组的元素如下:[部门ids字符串,邮箱,昵称,密码,姓名,身份证] export function storeBatch(startLine: number, users: string[][]) { - return client.post("/backend/v1/user/create", { + return client.post("/backend/v1/user/store-batch", { start_line: startLine, users: users, }); diff --git a/src/pages/index.ts b/src/pages/index.ts index a45a140..0a329fe 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -7,6 +7,7 @@ export * from "./course/vod"; export * from "./member/index"; export * from "./member/create"; export * from "./member/update"; +export * from "./member/import"; export * from "./system/administrator/index"; export * from "./system/administrator/create"; export * from "./system/administrator/update"; diff --git a/src/pages/member/import.module.less b/src/pages/member/import.module.less new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/member/import.tsx b/src/pages/member/import.tsx new file mode 100644 index 0000000..75e4a33 --- /dev/null +++ b/src/pages/member/import.tsx @@ -0,0 +1,86 @@ +import React, { useState, useEffect } from "react"; +import * as XLSX from "xlsx"; +import { Row, Col, Form, Input, Cascader, Button, Upload, message } from "antd"; +import { BackBartment } from "../../compenents"; +import { user } from "../../api/index"; +import { useNavigate } from "react-router-dom"; + +export const MemberImportPage: React.FC = () => { + const navigate = useNavigate(); + const [tableData, setWageTableData] = useState([]); + + const uploadProps = { + accept: ".xls,.xlsx,application/vnd.ms-excel", + beforeUpload: (file: any) => { + const f = file; + const reader = new FileReader(); + reader.onload = (e: any) => { + const datas = e.target.result; + const workbook = XLSX.read(datas, { + type: "binary", + }); + const first_worksheet = workbook.Sheets[workbook.SheetNames[0]]; + const jsonArr = XLSX.utils.sheet_to_json(first_worksheet, { + header: 1, + }); + handleImpotedJson(jsonArr, file); + }; + reader.readAsBinaryString(f); + return false; + }, + onRemove: () => { + setWageTableData([]); + }, + }; + const handleImpotedJson = (jsonArr: any, file: any) => { + //jsonArr返回的是你上传的excel表格的每一行的数据 是数组形式 + jsonArr.splice(0, 1); // 去掉表头 + const jsonArrData = jsonArr.map((item: any, index: number) => { + // console.log(item, index); + let arr = []; + //在这写你需要的处理逻辑 + // jsonObj.id = data.length + index + 1; + // jsonObj.key = data.length + index + 1 + ''; + // jsonObj.name = item[0]; + + // jsonObj.profession = item[1]; + // jsonObj.pay = item[2]; + // jsonObj.work = item[3]; + arr.push(item); + return arr; + }); + + // setData([...data, ...jsonArrData]); + setWageTableData(jsonArrData); + storeBatchTableData(jsonArrData); + }; + + const storeBatchTableData = (data: any) => { + user + .storeBatch(2, data) + .then((res: any) => { + message.success("导入成功!"); + navigate(-1); + }) + .catch(() => { + setWageTableData([]); + }); + }; + + return ( + <> + + +
+ +
+
+ + + +
+ +
+ + ); +}; diff --git a/src/pages/member/index.tsx b/src/pages/member/index.tsx index f0a08cb..fe88640 100644 --- a/src/pages/member/index.tsx +++ b/src/pages/member/index.tsx @@ -245,6 +245,11 @@ export const MemberPage: React.FC = () => { 新建 + + +