From e74ebcea6a97418fad3b91303e18798ebdb11ec3 Mon Sep 17 00:00:00 2001 From: Griffiths Lott Date: Wed, 11 Jan 2023 20:56:17 -0500 Subject: [PATCH] Basic Vue upload page that reads excel file. No document validation. ASP.Net API with endpoint to request the current data standard and an endpoint to allow for excel uploads. --- .gitignore | 4 +- backend/ColumnStandard.cs | 20 ++++++ backend/Controllers/ExcelUpload.cs | 43 +++++++++++++ .../Controllers/TemplateConfigController.cs | 33 ++++++++++ backend/Program.cs | 16 +++++ backend/Properties/launchSettings.json | 41 ++++++++++++ backend/appsettings.Development.json | 37 +++++++++++ backend/appsettings.json | 37 +++++++++++ backend/backend.csproj | 19 ++++++ package-lock.json | 64 ++++++++++++++----- package.json | 3 +- src/App.vue | 8 +-- src/components/FileUpload.vue | 53 +++++++++++++++ src/components/HelloWorld.vue | 58 ----------------- 14 files changed, 356 insertions(+), 80 deletions(-) create mode 100644 backend/ColumnStandard.cs create mode 100644 backend/Controllers/ExcelUpload.cs create mode 100644 backend/Controllers/TemplateConfigController.cs create mode 100644 backend/Program.cs create mode 100644 backend/Properties/launchSettings.json create mode 100644 backend/appsettings.Development.json create mode 100644 backend/appsettings.json create mode 100644 backend/backend.csproj create mode 100644 src/components/FileUpload.vue delete mode 100644 src/components/HelloWorld.vue diff --git a/.gitignore b/.gitignore index 403adbc..df796e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ .DS_Store node_modules /dist - +bin/ +obj/ # local env files .env.local @@ -21,3 +22,4 @@ pnpm-debug.log* *.njsproj *.sln *.sw? +*.xlsx \ No newline at end of file diff --git a/backend/ColumnStandard.cs b/backend/ColumnStandard.cs new file mode 100644 index 0000000..37d7d68 --- /dev/null +++ b/backend/ColumnStandard.cs @@ -0,0 +1,20 @@ +namespace backend.Models +{ + + public class ColumnStandard + { + public ColumnStandard(string header, string headerRegex, string valueRegex, bool nullable = false) + { + Header = header; + HeaderRegex = headerRegex; + ValueRegex = valueRegex; + Nullable = nullable; + } + public string Header { get; set; } + public string HeaderRegex { get; set; } + public string ValueRegex { get; set; } + public bool Nullable { get; set; } + + } + +} \ No newline at end of file diff --git a/backend/Controllers/ExcelUpload.cs b/backend/Controllers/ExcelUpload.cs new file mode 100644 index 0000000..10fcbe7 --- /dev/null +++ b/backend/Controllers/ExcelUpload.cs @@ -0,0 +1,43 @@ + +using Microsoft.AspNetCore.Mvc; + +namespace backend.Controllers +{ + [Route("api/excelupload")] + [ApiController] + public class ExcelUpload : ControllerBase + { + private readonly IConfiguration _config; + + + public ExcelUpload(IConfiguration config) + { + _config = config; + } + + [HttpPost] + public void ProcessUpload(IFormFile file) + { + // TODO : Add some header validation to make sure it comes from a real user + if (file == null) + { + Console.WriteLine("fail: FILE IS NULL"); + return; + } + + string dataFileName = Path.GetFileName(file.FileName); + + string curDate = DateTime.Now.ToString("u"); + + string saveToPath = Path.Combine(_config.GetValue("UploadSavePath"), curDate + '_' + dataFileName); + + using (FileStream stream = new FileStream(saveToPath, FileMode.Create)) + { + file.CopyTo(stream); + Console.WriteLine($"Saved to {saveToPath}."); + } + + } + + } +} \ No newline at end of file diff --git a/backend/Controllers/TemplateConfigController.cs b/backend/Controllers/TemplateConfigController.cs new file mode 100644 index 0000000..4f47480 --- /dev/null +++ b/backend/Controllers/TemplateConfigController.cs @@ -0,0 +1,33 @@ +using Microsoft.AspNetCore.Mvc; +using backend.Models; +using Newtonsoft.Json; + +namespace backend.Controllers +{ + [Route("api/template")] + [ApiController] + public class TemplateConfigController : ControllerBase + { + + private readonly IConfiguration _config; + + public TemplateConfigController(IConfiguration configuration) + { + _config = configuration; + } + + [HttpGet] + public ActionResult Get() + { + Console.WriteLine("template get triggered"); + List? dataStandard = _config.GetSection("DataStandard").Get>(); + + if (dataStandard == null) + { + return "Failed to retreieve data standard!"; + } + return JsonConvert.SerializeObject(dataStandard); + } + + } +} \ No newline at end of file diff --git a/backend/Program.cs b/backend/Program.cs new file mode 100644 index 0000000..6655aad --- /dev/null +++ b/backend/Program.cs @@ -0,0 +1,16 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddControllers() + .AddNewtonsoftJson(); + + +var app = builder.Build(); + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); diff --git a/backend/Properties/launchSettings.json b/backend/Properties/launchSettings.json new file mode 100644 index 0000000..89a06bc --- /dev/null +++ b/backend/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:64384", + "sslPort": 44316 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5252", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7226;http://localhost:5252", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/backend/appsettings.Development.json b/backend/appsettings.Development.json new file mode 100644 index 0000000..3689ccd --- /dev/null +++ b/backend/appsettings.Development.json @@ -0,0 +1,37 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Test" : "It Worked!", + "UploadSavePath": "../Uploaded/", + "DataStandard" : [ + {"Header": "Contract Number", "HeaderRegex": "PG1 FICO", "ValueRegex": "^\\d+\\d$", "Nullable": false}, + {"Header": "Customer Name", "HeaderRegex": "(?i)(cust(omer)?\\s?name)", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "Phone Number", "HeaderRegex": "(?i)phone\\s?(num(ber)?|#)?", "ValueRegex": "(\\+?\\d-?)?\\s?\\(?\\d{3}\\)?-?\\s?\\d{3}-?\\s?\\d{4}", "Nullable": false}, + {"Header": "Tax-ID", "HeaderRegex": "(?i)(tax-?id)|(TIN)|(EIN)", "ValueRegex": "(\\d{2}-?\\d{7})|((\\d{3}){2}\\d{3})|(\\d{3}-?\\d{2}-?\\d{4})", "Nullable": false}, + {"Header": "Debtor Address 1", "HeaderRegex": "(?i)debtor\\s?add(ress)?", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "Debtor City", "HeaderRegex": "(?i)debtor\\s?city", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "Debtor State", "HeaderRegex": "(?i)debtor\\s?state", "ValueRegex": "\\w+", "Nullable": false}, + {"Header": "Debtor Zip Code", "HeaderRegex": "(?i)debtor\\s?zip\\s?(code)?", "ValueRegex": "\\d{5}-?(\\d{4})?", "Nullable": false}, + {"Header": "Date Booked", "HeaderRegex": "(?i)date\\s?booked", "ValueRegex": "[1-2]?\\d\\/\\d{1,2}\\/(20)?\\d{2}", "Nullable": false}, + {"Header": "Term", "HeaderRegex": "(?i)term\\s?(\\(?months\\)?)?", "ValueRegex": "\\d{1,3}", "Nullable": false}, + {"Header": "Payment Amount", "HeaderRegex": "(?i)pa?yme?n?t\\s?am(oun)?t", "ValueRegex": "(\\d{1,2},?)*\\d+(.\\d{2})?", "Nullable": false}, + {"Header": "Financed Amount", "HeaderRegex": "(?i)financed\\s?am(oun)?t", "ValueRegex": "(\\d{1,2},?)*\\d+(.\\d{2})?", "Nullable": false}, + {"Header": "Receivable balance", "HeaderRegex": "(?i)rec(eivable)?\\s?bal(ance)?", "ValueRegex": "(\\d{1,2},?)*\\d+(.\\d{2})?", "Nullable": false}, + {"Header": "Asset Description", "HeaderRegex": "(?i)asset\\sdesc(ription)?", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "Serial Number", "HeaderRegex": "(?i)serial\\s?num(ber)?|VIN", "ValueRegex": "\\d{8}", "Nullable": false}, + {"Header": "Business Type", "HeaderRegex": "(?i)(business|biz)\\s?type", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG Name", "HeaderRegex": "(?i)pg\\s?name", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG Address Line 1", "HeaderRegex": "(?i)pg\\s?add(ress)?", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG City", "HeaderRegex": "(?i)pg\\s?city", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG State", "HeaderRegex": "(?i)pg\\s?state", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG Zip", "HeaderRegex": "(?i)pg\\s?zip", "ValueRegex": "\\d{5}-?(\\d{4})?", "Nullable": false}, + {"Header": "PG SSN", "HeaderRegex": "(?i)pg\\s?ssn", "ValueRegex": "\\d{3}-?\\d{2}-?\\d{3}", "Nullable": false}, + {"Header": "DOB", "HeaderRegex": "(?i)Dob", "ValueRegex": "[0-2]?\\d\\/\\d{1,2}\\/(19|20)?\\d{2}", "Nullable": false}, + {"Header": "PG1 FICO", "HeaderRegex": "", "ValueRegex": "\\d{3}", "Nullable": false} + ] +} diff --git a/backend/appsettings.json b/backend/appsettings.json new file mode 100644 index 0000000..af5cbd7 --- /dev/null +++ b/backend/appsettings.json @@ -0,0 +1,37 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Test" : "It Worked!", + "UploadSavePath": "../Uploaded/", + "DataStandard" : [ + {"Header": "Contract Number", "HeaderRegex": "PG1 FICO", "ValueRegex": "^\\d+\\d$", "Nullable": false}, + {"Header": "Customer Name", "HeaderRegex": "(?i)(cust(omer)?\\s?name)", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "Phone Number", "HeaderRegex": "(?i)phone\\s?(num(ber)?|#)?", "ValueRegex": "(\\+?\\d-?)?\\s?\\(?\\d{3}\\)?-?\\s?\\d{3}-?\\s?\\d{4}", "Nullable": false}, + {"Header": "Tax-ID", "HeaderRegex": "(?i)(tax-?id)|(TIN)|(EIN)", "ValueRegex": "(\\d{2}-?\\d{7})|((\\d{3}){2}\\d{3})|(\\d{3}-?\\d{2}-?\\d{4})", "Nullable": false}, + {"Header": "Debtor Address 1", "HeaderRegex": "(?i)debtor\\s?add(ress)?", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "Debtor City", "HeaderRegex": "(?i)debtor\\s?city", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "Debtor State", "HeaderRegex": "(?i)debtor\\s?state", "ValueRegex": "\\w+", "Nullable": false}, + {"Header": "Debtor Zip Code", "HeaderRegex": "(?i)debtor\\s?zip\\s?(code)?", "ValueRegex": "\\d{5}-?(\\d{4})?", "Nullable": false}, + {"Header": "Date Booked", "HeaderRegex": "(?i)date\\s?booked", "ValueRegex": "[1-2]?\\d\\/\\d{1,2}\\/(20)?\\d{2}", "Nullable": false}, + {"Header": "Term", "HeaderRegex": "(?i)term\\s?(\\(?months\\)?)?", "ValueRegex": "\\d{1,3}", "Nullable": false}, + {"Header": "Payment Amount", "HeaderRegex": "(?i)pa?yme?n?t\\s?am(oun)?t", "ValueRegex": "(\\d{1,2},?)*\\d+(.\\d{2})?", "Nullable": false}, + {"Header": "Financed Amount", "HeaderRegex": "(?i)financed\\s?am(oun)?t", "ValueRegex": "(\\d{1,2},?)*\\d+(.\\d{2})?", "Nullable": false}, + {"Header": "Receivable balance", "HeaderRegex": "(?i)rec(eivable)?\\s?bal(ance)?", "ValueRegex": "(\\d{1,2},?)*\\d+(.\\d{2})?", "Nullable": false}, + {"Header": "Asset Description", "HeaderRegex": "(?i)asset\\sdesc(ription)?", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "Serial Number", "HeaderRegex": "(?i)serial\\s?num(ber)?|VIN", "ValueRegex": "\\d{8}", "Nullable": false}, + {"Header": "Business Type", "HeaderRegex": "(?i)(business|biz)\\s?type", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG Name", "HeaderRegex": "(?i)pg\\s?name", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG Address Line 1", "HeaderRegex": "(?i)pg\\s?add(ress)?", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG City", "HeaderRegex": "(?i)pg\\s?city", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG State", "HeaderRegex": "(?i)pg\\s?state", "ValueRegex": "(\\w+\\s?)+", "Nullable": false}, + {"Header": "PG Zip", "HeaderRegex": "(?i)pg\\s?zip", "ValueRegex": "\\d{5}-?(\\d{4})?", "Nullable": false}, + {"Header": "PG SSN", "HeaderRegex": "(?i)pg\\s?ssn", "ValueRegex": "\\d{3}-?\\d{2}-?\\d{3}", "Nullable": false}, + {"Header": "DOB", "HeaderRegex": "(?i)Dob", "ValueRegex": "[0-2]?\\d\\/\\d{1,2}\\/(19|20)?\\d{2}", "Nullable": false}, + {"Header": "PG1 FICO", "HeaderRegex": "", "ValueRegex": "\\d{3}", "Nullable": false} + ] +} \ No newline at end of file diff --git a/backend/backend.csproj b/backend/backend.csproj new file mode 100644 index 0000000..135c555 --- /dev/null +++ b/backend/backend.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index af669aa..448e136 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "0.1.0", "dependencies": { "core-js": "^3.8.3", - "vue": "^3.2.13" + "vue": "^3.2.13", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz" }, "devDependencies": { "@babel/core": "^7.12.16", @@ -11387,6 +11388,18 @@ } } }, + "node_modules/xlsx": { + "version": "0.19.1", + "resolved": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz", + "integrity": "sha512-pPh/ybd1bChlhCrtQ9QmRUx2yjQwMbS4tfvV9MSA2Qmm7vRUHQtPDMlLjAvQ2A4v8G92i2RlrNkSOKb1bwY7ww==", + "license": "Apache-2.0", + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -13420,7 +13433,8 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz", "integrity": "sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==", - "dev": true + "dev": true, + "requires": {} }, "@vue/cli-service": { "version": "5.0.8", @@ -13941,13 +13955,15 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "dev": true, + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "8.2.0", @@ -14006,7 +14022,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-colors": { "version": "4.1.3", @@ -14803,7 +14820,8 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "dev": true + "dev": true, + "requires": {} }, "css-loader": { "version": "6.7.3", @@ -14989,7 +15007,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true + "dev": true, + "requires": {} }, "csso": { "version": "4.2.0", @@ -16475,7 +16494,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "ieee754": { "version": "1.2.1", @@ -17850,25 +17870,29 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true + "dev": true, + "requires": {} }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-loader": { "version": "6.2.1", @@ -17973,7 +17997,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -18008,7 +18033,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true + "dev": true, + "requires": {} }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -19836,7 +19862,8 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -19963,7 +19990,12 @@ "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true + "dev": true, + "requires": {} + }, + "xlsx": { + "version": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz", + "integrity": "sha512-pPh/ybd1bChlhCrtQ9QmRUx2yjQwMbS4tfvV9MSA2Qmm7vRUHQtPDMlLjAvQ2A4v8G92i2RlrNkSOKb1bwY7ww==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index 988c18e..2bc413a 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ }, "dependencies": { "core-js": "^3.8.3", - "vue": "^3.2.13" + "vue": "^3.2.13", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.1/xlsx-0.19.1.tgz" }, "devDependencies": { "@babel/core": "^7.12.16", diff --git a/src/App.vue b/src/App.vue index 591a031..099decc 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,15 +1,15 @@ diff --git a/src/components/FileUpload.vue b/src/components/FileUpload.vue new file mode 100644 index 0000000..badb8c6 --- /dev/null +++ b/src/components/FileUpload.vue @@ -0,0 +1,53 @@ + + + \ No newline at end of file diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue deleted file mode 100644 index 879051a..0000000 --- a/src/components/HelloWorld.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - - -