Browse Source

配置vue文件

zhousheng 5 years ago
parent
commit
2673895fbd
30 changed files with 15958 additions and 148 deletions
  1. 21 0
      TEAMModel.Contest/ContestApp/.gitignore
  2. 26 0
      TEAMModel.Contest/ContestApp/README.md
  3. 5 0
      TEAMModel.Contest/ContestApp/babel.config.js
  4. BIN
      TEAMModel.Contest/ContestApp/public/favicon.ico
  5. 17 0
      TEAMModel.Contest/ContestApp/public/index.html
  6. 29 0
      TEAMModel.Contest/ContestApp/src/App.vue
  7. BIN
      TEAMModel.Contest/ContestApp/src/assets/logo.png
  8. 57 0
      TEAMModel.Contest/ContestApp/src/components/HelloWorld.vue
  9. 12 0
      TEAMModel.Contest/ContestApp/src/main.js
  10. 25 0
      TEAMModel.Contest/ContestApp/src/router.js
  11. 16 0
      TEAMModel.Contest/ContestApp/src/store.js
  12. 5 0
      TEAMModel.Contest/ContestApp/src/views/About.vue
  13. 18 0
      TEAMModel.Contest/ContestApp/src/views/Home.vue
  14. 9 0
      TEAMModel.Contest/Startup.cs
  15. 7 7
      TEAMModel.Contest/Views/Home/Index.cshtml
  16. 0 6
      TEAMModel.Contest/Views/Home/Privacy.cshtml
  17. 0 25
      TEAMModel.Contest/Views/Shared/Error.cshtml
  18. 0 25
      TEAMModel.Contest/Views/Shared/_CookieConsentPartial.cshtml
  19. 14 67
      TEAMModel.Contest/Views/Shared/_Layout.cshtml
  20. 0 18
      TEAMModel.Contest/Views/Shared/_ValidationScriptsPartial.cshtml
  21. 13387 0
      TEAMModel.Contest/package-lock.json
  22. 121 0
      TEAMModel.Contest/package.json
  23. 68 0
      TEAMModel.Contest/webpack.config.js
  24. 53 0
      TEAMModel.Contest/webpack.config.vendor.js
  25. 40 0
      TEAMModel.Contest/wwwroot/dist/0.js
  26. 1 0
      TEAMModel.Contest/wwwroot/dist/0.js.map
  27. 1501 0
      TEAMModel.Contest/wwwroot/dist/main.js
  28. 1 0
      TEAMModel.Contest/wwwroot/dist/main.js.map
  29. 1 0
      TEAMModel.Contest/wwwroot/dist/vendor-manifest.json
  30. 524 0
      TEAMModel.Contest/wwwroot/dist/vendor.js

+ 21 - 0
TEAMModel.Contest/ContestApp/.gitignore

@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 26 - 0
TEAMModel.Contest/ContestApp/README.md

@@ -0,0 +1,26 @@
+# contest
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your tests
+```
+npm run test
+```
+
+### Lints and fixes files
+```
+npm run lint
+```

+ 5 - 0
TEAMModel.Contest/ContestApp/babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/app'
+  ]
+}

BIN
TEAMModel.Contest/ContestApp/public/favicon.ico


+ 17 - 0
TEAMModel.Contest/ContestApp/public/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title>contest</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but contest doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 29 - 0
TEAMModel.Contest/ContestApp/src/App.vue

@@ -0,0 +1,29 @@
+<template>
+  <div id="app">
+    <div id="nav">
+      <router-link to="/">Home</router-link> |
+      <router-link to="/about">About</router-link>
+    </div>
+    <router-view/>
+  </div>
+</template>
+
+<style lang="less">
+#app {
+  font-family: 'Avenir', Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  text-align: center;
+  color: #2c3e50;
+}
+#nav {
+  padding: 30px;
+  a {
+    font-weight: bold;
+    color: #2c3e50;
+    &.router-link-exact-active {
+      color: #42b983;
+    }
+  }
+}
+</style>

BIN
TEAMModel.Contest/ContestApp/src/assets/logo.png


+ 57 - 0
TEAMModel.Contest/ContestApp/src/components/HelloWorld.vue

@@ -0,0 +1,57 @@
+<template>
+  <div class="hello">
+    <h1>{{ msg }}</h1>
+    <p>
+      For a guide and recipes on how to configure / customize this project,<br>
+      check out the
+      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
+    </p>
+    <h3>Installed CLI Plugins</h3>
+    <ul>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
+    </ul>
+    <h3>Essential Links</h3>
+    <ul>
+      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
+      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
+      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
+      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
+      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
+    </ul>
+    <h3>Ecosystem</h3>
+    <ul>
+      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
+      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
+      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
+      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
+      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
+    </ul>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'HelloWorld',
+  props: {
+    msg: String
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped lang="less">
+h3 {
+  margin: 40px 0 0;
+}
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+a {
+  color: #42b983;
+}
+</style>

+ 12 - 0
TEAMModel.Contest/ContestApp/src/main.js

@@ -0,0 +1,12 @@
+import Vue from 'vue'
+import App from './App.vue'
+import router from './router'
+import store from './store'
+
+Vue.config.productionTip = false
+
+new Vue({
+  router,
+  store,
+  render: h => h(App)
+}).$mount('#app')

+ 25 - 0
TEAMModel.Contest/ContestApp/src/router.js

@@ -0,0 +1,25 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import Home from './views/Home.vue'
+
+Vue.use(Router)
+
+export default new Router({
+  mode: 'history',
+  base: process.env.BASE_URL,
+  routes: [
+    {
+      path: '/',
+      name: 'home',
+      component: Home
+    },
+    {
+      path: '/about',
+      name: 'about',
+      // route level code-splitting
+      // this generates a separate chunk (about.[hash].js) for this route
+      // which is lazy-loaded when the route is visited.
+        component: resolve => require(['./views/About.vue'], resolve)
+    }
+  ]
+})

+ 16 - 0
TEAMModel.Contest/ContestApp/src/store.js

@@ -0,0 +1,16 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+  state: {
+
+  },
+  mutations: {
+
+  },
+  actions: {
+
+  }
+})

+ 5 - 0
TEAMModel.Contest/ContestApp/src/views/About.vue

@@ -0,0 +1,5 @@
+<template>
+  <div class="about">
+    <h1>This is an about page</h1>
+  </div>
+</template>

+ 18 - 0
TEAMModel.Contest/ContestApp/src/views/Home.vue

@@ -0,0 +1,18 @@
+<template>
+  <div class="home">
+    <img alt="Vue logo" src="../assets/logo.png">
+    <HelloWorld msg="Welcome to Your Vue.js App"/>
+  </div>
+</template>
+
+<script>
+// @ is an alias to /src
+import HelloWorld from '@/components/HelloWorld.vue'
+
+export default {
+  name: 'home',
+  components: {
+    HelloWorld
+  }
+}
+</script>

+ 9 - 0
TEAMModel.Contest/Startup.cs

@@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.SpaServices.Webpack;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection;
 
 
@@ -40,6 +41,11 @@ namespace TEAMModel.Contest
             if (env.IsDevelopment())
             if (env.IsDevelopment())
             {
             {
                 app.UseDeveloperExceptionPage();
                 app.UseDeveloperExceptionPage();
+                // Webpack initialization with hot-reload.
+                app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
+                {
+                    HotModuleReplacement = true,
+                });
             }
             }
             else
             else
             {
             {
@@ -54,6 +60,9 @@ namespace TEAMModel.Contest
                 routes.MapRoute(
                 routes.MapRoute(
                     name: "default",
                     name: "default",
                     template: "{controller=Home}/{action=Index}/{id?}");
                     template: "{controller=Home}/{action=Index}/{id?}");
+                routes.MapSpaFallbackRoute(
+                    name: "spa-fallback",
+                    defaults: new { controller = "Home", action = "Index" });
             });
             });
         }
         }
     }
     }

+ 7 - 7
TEAMModel.Contest/Views/Home/Index.cshtml

@@ -1,8 +1,8 @@
-@{
-    ViewData["Title"] = "Home Page";
-}
+@{ ViewData["Title"] = ""; }
+
 
 
-<div class="text-center">
-    <h1 class="display-4">Welcome</h1>
-    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
-</div>
+<div id="app"></div>
+
+@section scripts {
+    <script src="~/dist/main.js" asp-append-version="true"></script>
+}

+ 0 - 6
TEAMModel.Contest/Views/Home/Privacy.cshtml

@@ -1,6 +0,0 @@
-@{
-    ViewData["Title"] = "Privacy Policy";
-}
-<h1>@ViewData["Title"]</h1>
-
-<p>Use this page to detail your site's privacy policy.</p>

+ 0 - 25
TEAMModel.Contest/Views/Shared/Error.cshtml

@@ -1,25 +0,0 @@
-@model ErrorViewModel
-@{
-    ViewData["Title"] = "Error";
-}
-
-<h1 class="text-danger">Error.</h1>
-<h2 class="text-danger">An error occurred while processing your request.</h2>
-
-@if (Model.ShowRequestId)
-{
-    <p>
-        <strong>Request ID:</strong> <code>@Model.RequestId</code>
-    </p>
-}
-
-<h3>Development Mode</h3>
-<p>
-    Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
-</p>
-<p>
-    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
-    It can result in displaying sensitive information from exceptions to end users.
-    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
-    and restarting the app.
-</p>

+ 0 - 25
TEAMModel.Contest/Views/Shared/_CookieConsentPartial.cshtml

@@ -1,25 +0,0 @@
-@using Microsoft.AspNetCore.Http.Features
-
-@{
-    var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
-    var showBanner = !consentFeature?.CanTrack ?? false;
-    var cookieString = consentFeature?.CreateConsentCookie();
-}
-
-@if (showBanner)
-{
-    <div id="cookieConsent" class="alert alert-info alert-dismissible fade show" role="alert">
-        Use this space to summarize your privacy and cookie use policy. <a asp-area="" asp-controller="Home" asp-action="Privacy">Learn More</a>.
-        <button type="button" class="accept-policy close" data-dismiss="alert" aria-label="Close" data-cookie-string="@cookieString">
-            <span aria-hidden="true">Accept</span>
-        </button>
-    </div>
-    <script>
-        (function () {
-            var button = document.querySelector("#cookieConsent button[data-cookie-string]");
-            button.addEventListener("click", function (event) {
-                document.cookie = button.dataset.cookieString;
-            }, false);
-        })();
-    </script>
-}

+ 14 - 67
TEAMModel.Contest/Views/Shared/_Layout.cshtml

@@ -1,77 +1,24 @@
 <!DOCTYPE html>
 <!DOCTYPE html>
 <html>
 <html>
+
 <head>
 <head>
     <meta charset="utf-8" />
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>@ViewData["Title"] - TEAMModel.Contest</title>
-
-    <environment include="Development">
-        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
-    </environment>
-    <environment exclude="Development">
-        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
-              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
-              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute"
-              crossorigin="anonymous"
-              integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"/>
-    </environment>
-    <link rel="stylesheet" href="~/css/site.css" />
+    <title>@ViewData["Title"]TEAM Model OS</title>
+    @*<link rel="stylesheet" href="~/dist/style.css" asp-append-version="true" />*@
+    <link rel="icon" type="image/x-icon" class="js-site-favicon" href="https://account.habookaclass.biz/dist/6854ccd21afb6b1f994e1556c2360dd8.ico">
+    @*<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />
+        <environment names="Staging,Production">
+            <link rel="stylesheet" href="~/dist/site.css" asp-append-version="true" />
+        </environment>*@
 </head>
 </head>
-<body>
-    <header>
-        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
-            <div class="container">
-                <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">TEAMModel.Contest</a>
-                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
-                        aria-expanded="false" aria-label="Toggle navigation">
-                    <span class="navbar-toggler-icon"></span>
-                </button>
-                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
-                    <ul class="navbar-nav flex-grow-1">
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
-                        </li>
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </nav>
-    </header>
-    <div class="container">
-        <partial name="_CookieConsentPartial" />
-        <main role="main" class="pb-3">
-            @RenderBody()
-        </main>
-    </div>
 
 
-    <footer class="border-top footer text-muted">
-        <div class="container">
-            &copy; 2019 - TEAMModel.Contest - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
-        </div>
-    </footer>
-
-    <environment include="Development">
-        <script src="~/lib/jquery/dist/jquery.js"></script>
-        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
-    </environment>
-    <environment exclude="Development">
-        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"
-                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
-                asp-fallback-test="window.jQuery"
-                crossorigin="anonymous"
-                integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=">
-        </script>
-        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"
-                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
-                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
-                crossorigin="anonymous"
-                integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o">
-        </script>
-    </environment>
-    <script src="~/js/site.js" asp-append-version="true"></script>
+<body>
+    @RenderBody()
+    <script src="~/dist/vendor.js" asp-append-version="true"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML" asp-append-version="true"></script>
 
 
-    @RenderSection("Scripts", required: false)
+    @RenderSection("scripts", required: false)
 </body>
 </body>
+
 </html>
 </html>

+ 0 - 18
TEAMModel.Contest/Views/Shared/_ValidationScriptsPartial.cshtml

@@ -1,18 +0,0 @@
-<environment include="Development">
-    <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
-    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
-</environment>
-<environment exclude="Development">
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"
-            asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
-            asp-fallback-test="window.jQuery && window.jQuery.validator"
-            crossorigin="anonymous"
-            integrity="sha256-F6h55Qw6sweK+t7SiOJX+2bpSAa3b/fnlrVCJvmEj1A=">
-    </script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"
-            asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
-            asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
-            crossorigin="anonymous"
-            integrity="sha256-9GycpJnliUjJDVDqP0UEu/bsm9U+3dnQUH8+3W10vkY=">
-    </script>
-</environment>

File diff suppressed because it is too large
+ 13387 - 0
TEAMModel.Contest/package-lock.json


+ 121 - 0
TEAMModel.Contest/package.json

@@ -0,0 +1,121 @@
+{
+  "name": "ContestApp",
+  "description": "ContestApp",
+  "author": "Habook",
+  "license": "MIT",
+  "scripts": {
+    "dev": "cross-env ASPNETCORE_ENVIRONMENT=Development NODE_ENV=development dotnet run",
+    "build": "npm run build-vendor:prod && npm run build:prod",
+    "build:prod": "cross-env NODE_ENV=production webpack --progress --hide-modules",
+    "build-vendor:prod": "cross-env NODE_ENV=production webpack --config webpack.config.vendor.js --progress",
+    "build-vendor:dev": "cross-env NODE_ENV=development webpack --config webpack.config.vendor.js --progress",
+    "lint": "eslint -c ./.eslintrc.js ClientApp/**/*.js  ClientApp/**/*.vue  ClientApp/**/*.json webpack*.js",
+    "install": "npm run build-vendor:dev",
+    "update-packages": "npx npm-check -u"
+  },
+  "dependencies": {
+    "animate.css": "^3.7.0",
+    "axios": "^0.18.0",
+    "bcryptjs": "^2.4.3",
+    "core-js": "^2.5.3",
+    "echarts": "^4.2.1",
+    "iview": "^3.3.3",
+    "jquery": "^3.3.1",
+    "jwt-decode": "^2.2.0",
+    "less": "^3.9.0",
+    "moment": "^2.23.0",
+    "videojs-contrib-hls": "^5.15.0",
+    "videojs-contrib-hls.js": "^3.2.0",
+    "vue": "^2.6.9",
+    "vue-calendar-component": "^2.7.4",
+    "vue-full-calendar": "^2.7.0",
+    "vue-fullcalendar": "^1.0.9",
+    "vue-infinite-loading": "^2.4.3",
+    "vue-jlunar-datepicker": "^2.3.0",
+    "vue-lunar-full-calendar": "^1.2.2",
+    "vue-router": "^3.0.2",
+    "vue-scroll": "^2.1.9",
+    "vue-video-player": "^5.0.2",
+    "vuex": "^3.1.0",
+    "vuex-router-sync": "^5.0.0"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.2.2",
+    "@babel/plugin-proposal-class-properties": "^7.0.0",
+    "@babel/plugin-proposal-decorators": "^7.0.0",
+    "@babel/plugin-proposal-export-namespace-from": "^7.0.0",
+    "@babel/plugin-proposal-function-sent": "^7.0.0",
+    "@babel/plugin-proposal-json-strings": "^7.0.0",
+    "@babel/plugin-proposal-numeric-separator": "^7.0.0",
+    "@babel/plugin-proposal-throw-expressions": "^7.0.0",
+    "@babel/plugin-syntax-dynamic-import": "^7.0.0",
+    "@babel/plugin-syntax-import-meta": "^7.0.0",
+    "@babel/plugin-transform-async-to-generator": "^7.0.0",
+    "@babel/plugin-transform-runtime": "^7.0.0",
+    "@babel/preset-env": "^7.0.0",
+    "@babel/register": "^7.0.0",
+    "@babel/runtime": "^7.3.1",
+    "@fortawesome/fontawesome-svg-core": "^1.2.13",
+    "@fortawesome/free-brands-svg-icons": "^5.7.0",
+    "@fortawesome/free-solid-svg-icons": "^5.7.0",
+    "@fortawesome/vue-fontawesome": "^0.1.5",
+    "aspnet-webpack": "^3.0.0",
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.22.1",
+    "babel-eslint": "^10.0.1",
+    "babel-helper-vue-jsx-merge-props": "^2.0.3",
+    "babel-loader": "^8.0.5",
+    "babel-plugin-import": "^1.11.0",
+    "babel-plugin-syntax-jsx": "^6.18.0",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-plugin-transform-vue-jsx": "^3.5.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "chalk": "^2.0.1",
+    "copy-webpack-plugin": "^4.0.1",
+    "cross-env": "^5.2.0",
+    "css-loader": "^2.1.1",
+    "eslint": "^5.15.2",
+    "eslint-config-standard": "^12.0.0",
+    "eslint-plugin-html": "^5.0.0",
+    "eslint-plugin-import": "^2.9.0",
+    "eslint-plugin-node": "^8.0.1",
+    "eslint-plugin-promise": "^4.0.1",
+    "eslint-plugin-standard": "^4.0.0",
+    "event-source-polyfill": "^1.0.5",
+    "extract-text-webpack-plugin": "^3.0.0",
+    "file-loader": "^3.0.1",
+    "font-awesome": "^4.7.0",
+    "friendly-errors-webpack-plugin": "^1.6.1",
+    "html-webpack-plugin": "^2.30.1",
+    "less-loader": "^4.1.0",
+    "mini-css-extract-plugin": "^0.5.0",
+    "node-notifier": "^5.1.2",
+    "node-sass": "^4.12.0",
+    "optimize-css-assets-webpack-plugin": "^5.0.1",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
+    "postcss-import": "^11.0.0",
+    "postcss-loader": "^2.0.8",
+    "postcss-url": "^7.2.1",
+    "rimraf": "^2.6.0",
+    "sass-loader": "^7.1.0",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "style-loader": "^0.23.1",
+    "uglifyjs-webpack-plugin": "^1.1.1",
+    "url-loader": "^1.1.2",
+    "vue-i18n": "^8.9.0",
+    "vue-loader": "^15.7.0",
+    "vue-server-renderer": "^2.6.9",
+    "vue-style-loader": "^3.1.2",
+    "vue-template-compiler": "^2.6.9",
+    "vue-template-loader": "^1.0.0",
+    "webpack": "^4.29.0",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-cli": "^3.3.0",
+    "webpack-dev-server": "^3.1.14",
+    "webpack-hot-middleware": "^2.21.2",
+    "webpack-merge": "^4.1.0"
+  }
+}

+ 68 - 0
TEAMModel.Contest/webpack.config.js

@@ -0,0 +1,68 @@
+ const path = require('path')
+const webpack = require('webpack')
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const bundleOutputDir = './wwwroot/dist'
+const VueLoaderPlugin = require('vue-loader/lib/plugin')
+
+module.exports = () => {
+  // console.log('Building for \x1b[33m%s\x1b[0m', process.env.NODE_ENV)
+
+  const isDevBuild = !(process.env.NODE_ENV && process.env.NODE_ENV === 'production')
+  
+  const extractCSS = new MiniCssExtractPlugin({
+    filename: 'style.css'
+  })
+  return [{
+    mode: (isDevBuild ? 'development' :'production'  ),
+    stats: { modules: false },
+    entry: { 'main': './ContestApp/src/main.js' },
+    resolve: {
+      extensions: ['.js', '.vue'],
+      alias: isDevBuild ? {
+        'vue$': 'vue/dist/vue',
+        'components': path.resolve(__dirname, './ContestApp/components'),
+        'views': path.resolve(__dirname, './ContestApp/views'),
+        '@': path.resolve(__dirname, './ContestApp/src'),
+      }: {
+        'components': path.resolve(__dirname, './ContestApp/components'),
+        'views': path.resolve(__dirname, './ContestApp/views'),
+        '@': path.resolve(__dirname, './ContestApp/src'),
+      }
+    },
+    output: {
+      path: path.join(__dirname, bundleOutputDir),
+      filename: '[name].js',
+      publicPath: '/dist/'
+    },
+    module: {
+      rules: [
+        { test: /\.vue$/, include: /ContestApp/, use: 'vue-loader' },
+        { test: /\.js$/, include: /ContestApp/, use: 'babel-loader' },
+        { test: /\.css$/, use: isDevBuild ? ['style-loader', 'css-loader'] : [MiniCssExtractPlugin.loader, 'css-loader'] },
+        { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' },
+        { test: /\.(eot|ttf|woff|woff2)$/, loader: 'file-loader' },
+        { test: /\.less$/, use: [{ loader: "style-loader"}, {loader: "css-loader"}, {loader: "less-loader", options: { javascriptEnabled: true }}] }
+      ]
+    },
+    plugins: [
+      new VueLoaderPlugin(),
+      new webpack.DllReferencePlugin({
+        context: __dirname,
+        manifest: require('./wwwroot/dist/vendor-manifest.json')
+      })
+    ].concat(isDevBuild ? [
+      new webpack.SourceMapDevToolPlugin({
+        filename: '[file].map', // Remove this line if you prefer inline source maps
+        moduleFilenameTemplate: path.relative(bundleOutputDir, '[resourcePath]') // Point sourcemap entries to the original file locations on disk
+      })
+    ] : [
+      extractCSS,
+      new OptimizeCSSPlugin({
+        cssProcessorOptions: {
+          safe: true
+        }
+      })
+    ])
+  }]
+}

+ 53 - 0
TEAMModel.Contest/webpack.config.vendor.js

@@ -0,0 +1,53 @@
+const path = require('path')
+const webpack = require('webpack')
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+
+module.exports = () => {
+  // console.log('Building vendor files for \x1b[33m%s\x1b[0m', process.env.NODE_ENV)
+
+  const isDevBuild = !(process.env.NODE_ENV && process.env.NODE_ENV === 'production')
+  
+  const extractCSS = new MiniCssExtractPlugin({
+    filename: 'vendor.css'
+  })
+
+  return [{
+    mode: (isDevBuild ? 'development' : 'production' ),
+    stats: { modules: false },
+    resolve: {
+      extensions: ['.js']
+    },
+    module: {
+      rules: [
+        { test: /\.vue$/, include: /ClientApp/, use: 'vue-loader' },
+        { test: /\.js$/, include: /ClientApp/, use: 'babel-loader' },
+        { test: /\.css$/, use: isDevBuild ? ['style-loader', 'css-loader'] : [MiniCssExtractPlugin.loader, 'css-loader'] },
+        { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' },
+        { test: /\.(eot|ttf|woff|woff2)$/, loader: 'file-loader' },
+        { test: /\.less$/, use: [{ loader: "style-loader" }, { loader: "css-loader" }, { loader: "less-loader", options: { javascriptEnabled: true } }] }
+      ]
+    },
+    entry: {
+      vendor: ['event-source-polyfill', 'vue', 'vuex', 'axios', 'vue-router']
+    },
+    output: {
+      path: path.join(__dirname, 'wwwroot', 'dist'),
+      publicPath: '/dist/',
+      filename: '[name].js',
+      library: '[name]_[hash]'
+    },
+    plugins: [
+      extractCSS,
+      new OptimizeCSSPlugin({
+        cssProcessorOptions: {
+          safe: true
+        }
+      }),
+      new webpack.DllPlugin({
+        path: path.join(__dirname, 'wwwroot', 'dist', '[name]-manifest.json'),
+        name: '[name]_[hash]'
+      })
+    ]
+  }]
+}

File diff suppressed because it is too large
+ 40 - 0
TEAMModel.Contest/wwwroot/dist/0.js


+ 1 - 0
TEAMModel.Contest/wwwroot/dist/0.js.map

@@ -0,0 +1 @@
+{"version":3,"sources":[],"names":[],"mappings":"","file":"0.js","sourceRoot":""}

File diff suppressed because it is too large
+ 1501 - 0
TEAMModel.Contest/wwwroot/dist/main.js


File diff suppressed because it is too large
+ 1 - 0
TEAMModel.Contest/wwwroot/dist/main.js.map


File diff suppressed because it is too large
+ 1 - 0
TEAMModel.Contest/wwwroot/dist/vendor-manifest.json


File diff suppressed because it is too large
+ 524 - 0
TEAMModel.Contest/wwwroot/dist/vendor.js