wzh 4 年 前
コミット
964154c0b1

+ 33 - 0
.gitignore

@@ -0,0 +1,33 @@
+# ---> Node
+# Logs
+logs
+*.log
+npm-debug.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
+node_modules
+
+dist
+
+src/views/index/test.vue

+ 6 - 2
README.md

@@ -1,3 +1,7 @@
-# DataDisplayPlatform_WebApp
+# Vue 3 + Vite
 
-展示平台-汇很多航运数字经济总控平台
+This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
+
+## Recommended IDE Setup
+
+- [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar)

+ 30 - 0
index.html

@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <!-- <link rel="icon" href="/src/assets/logo.png" /> -->
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>汇很多航运数字经济总控平台</title>
+    <script type="text/javascript" src="https://api.map.baidu.com/getscript?v=1.0&&type=webgl&ak=sUDwQMPuY7yO3ZqC8l4EEZB0jeVrx6wi"></script>
+    <style>
+      * {
+        margin: 0;
+        padding: 0;
+      }
+      html,
+      body {
+        height: 100%;
+        width: 100%;
+      }
+
+      #app {
+        height: 100%;
+        width: 100%;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 26 - 0
package.json

@@ -0,0 +1,26 @@
+{
+  "name": "jiangyunphotosagent",
+  "version": "0.0.0",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "serve": "vite preview"
+  },
+  "dependencies": {
+    "@element-plus/icons": "^0.0.11",
+    "axios": "^0.21.1",
+    "element-plus": "^1.1.0-beta.24",
+    "lodash": "^4.17.21",
+    "md5": "^2.3.0",
+    "swiper": "^7.3.0",
+    "vite-plugin-compression": "^0.3.5",
+    "vue": "^3.2.16",
+    "vue-router": "^4.0.4",
+    "vuex": "^4.0.2"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^1.9.3",
+    "sass": "^1.47.0",
+    "vite": "^2.6.4"
+  }
+}

BIN
public/展示平台.ico


+ 22 - 0
src/App.vue

@@ -0,0 +1,22 @@
+<template>
+  <Header v-if="this.$store.state.isLogin"></Header>
+  <router-view></router-view>
+</template>
+
+<script>
+import Header from "comps/Header.vue";
+import * as echarts from "echarts";
+import { provide } from "vue";
+
+export default {
+  components: {
+    Header,
+  },
+  setup() {
+    provide("ec", echarts);
+    return {};
+  },
+};
+</script>
+<style>
+</style>

+ 16 - 0
src/apis/cloudLogin.js

@@ -0,0 +1,16 @@
+import cloudbase from "@cloudbase/js-sdk";
+
+const tcb = cloudbase.init({
+  // env: "huihenduo-2gx127w7f837b584",
+});
+
+const auth = tcb.auth({
+  persistence: "local",
+});
+
+async function AnonymousLogin() {
+  await auth.anonymousAuthProvider().signIn();
+  const loginState = await auth.getLoginState();
+}
+AnonymousLogin();
+// export default tcb;

+ 22 - 0
src/apis/config.js

@@ -0,0 +1,22 @@
+const baseurl = "https://interface.yundao.info/yundao/";
+const uploadUrl = `${baseurl}cos/upload`;
+import axios from "axios";
+
+axios.interceptors.response.use(
+  function (response) {
+    return response;
+  },
+  function (error) {
+    return Promise.reject(error);
+  }
+);
+export const $http = function (url, data, method = "post") {
+  return axios({
+    method,
+    url: baseurl + url,
+    data,
+    withCredentials: true,
+  });
+};
+
+export default { baseurl, uploadUrl, $http };

+ 283 - 0
src/apis/fetch.js

@@ -0,0 +1,283 @@
+import { $http } from "./config";
+import { ElNotification, ElMessageBox, ElMessage } from "element-plus";
+
+export default {
+  // 获取店铺列表
+  getShopList(data) {
+    return $http("/shop/list", data);
+  },
+
+  // 获取店铺详情
+  getShopDetail(data) {
+    return $http("/shop/detail", data);
+  },
+
+  // 新增周边商铺
+  addAroundShop(data) {
+    return $http("/shop/add/aroundShop", data);
+  },
+
+  // 获取店铺周边商铺列表
+  getShopAroundList(data) {
+    return $http("/shop/around/list", data);
+  },
+
+  // 根据省市区获取商店下拉列表
+  getSelectByRegion(data) {
+    return $http("/shop/getSelectByRegion", data);
+  },
+
+  // 商品列表-品牌搜索-模糊列表
+  searchBrandSelect(data) {
+    return $http("/product/list/brand/data", data);
+  },
+
+  // 商品列表-商品类型搜索-模糊列表
+  searchSubfamilySelect(data) {
+    return $http("/product/list/subfamily/data", data);
+  },
+
+  // 获取商品列表
+  getProductList(data) {
+    return $http("/product/list", data);
+  },
+
+  // 获取商品详情
+  getProductDetail(data) {
+    return $http("/product/detail", data);
+  },
+
+  // 添加生命线
+  addLifeline(data) {
+    return $http("/product/lifeline/add", data);
+  },
+
+  // 删除生命线
+  deleteLifeline(data) {
+    return $http("/product/lifeline/delete", data);
+  },
+
+  // 更新生命线
+  updateLifeline(data) {
+    return $http("/product/lifeline/update", data);
+  },
+
+  // 获取省
+  getProvince() {
+    return $http("/region/province");
+  },
+
+  // 获取市
+  getCity(data) {
+    return $http("/region/city", data);
+  },
+
+  // 获取区
+  getDistrict(data) {
+    return $http("/region/district", data);
+  },
+
+  // 根据省市区获取店铺下拉列表
+  getShopByArea(data) {
+    return $http("/shop/getSelectByRegion", data);
+  },
+
+  // 创建决策组与子决策/新增子决策
+  addDecision(data) {
+    return $http("/decision/add", data);
+  },
+
+  // 获取营销决策列表
+  getDecisionList(data) {
+    return $http("/decision/list", data);
+  },
+
+  // 获取子决策组详情
+  getDecisionDetail(data) {
+    return $http("/decision/detail", data);
+  },
+
+  // 周边业态分析
+  aroundAnalyze(data) {
+    return $http("/decision/detail/aroundAnalyze", data);
+  },
+
+  // 周边业态词云分析
+  aroundWordCloudAnalyze(data) {
+    return $http("/decision/detail/aroundWordCloudAnalyze", data);
+  },
+
+  // 运算
+  doCalculation(data) {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve($http("/decision/doCalculation", data));
+      }, 8000);
+    });
+  },
+
+  // 创建营销决策-明星商品-模糊搜索下拉
+  getStarProductSelect(data) {
+    return $http("/decision/starProductSelect", data);
+  },
+
+  // 创建营销决策-商品功能-模糊搜索下拉
+  getFunctionSelect(data) {
+    return $http("/decision/functionSelect", data);
+  },
+
+  // 创建营销决策-生命周期-商品分类模糊搜索下拉
+  getCategorySelect(data) {
+    return $http("/decision/categorySelect", data);
+  },
+
+  // 生成知识点
+  generateWords(data) {
+    return $http("/product/generate/words", data);
+  },
+
+  // 商品折线图数据
+  getLineChartData(data) {
+    return $http("/product/lineChart", data);
+  },
+
+  // 获取决策组详情
+  getMainDecisionDetail(data) {
+    return $http("/decision/detail/main", data);
+  },
+
+  // 创建商品组合决策-ALL-选择商品分类模糊下拉
+  getCGFamilySelect(data) {
+    return $http("/decision/product/familySelect", data);
+  },
+
+  // 创建商品组合决策-明星商品-产品列表
+  getCGStarProductList(data) {
+    return $http("/decision/product/starProduct/productList", data);
+  },
+
+  // 创建商品组合决策-商品功能-产品列表
+  getCGFunctionList(data) {
+    return $http("/decision/product/productFunction/productList", data);
+  },
+
+  //创建商品组合决策-生命周期-产品列表
+  getCGLifeCycleList(data) {
+    return $http("/decision/product/lifeCycle/productList", data);
+  },
+
+  //创建商品组合决策-商品功能/生命周期-选择IP下拉数据
+  getCGIpSelect(data) {
+    return $http("/decision/product/productFunction/ipSelect", data);
+  },
+
+  // 创建商品组合决策-商品功能/生命周期-选择生命周期事件数据
+  getCGLifeline(data) {
+    return $http("/decision/product/productFunction/lifeline", data);
+  },
+
+  // 创建商品组合决策
+  createGroup(data) {
+    return $http("/decision/product/createGroup", data);
+  },
+
+  // 商品组合分析
+  CGDoCalc(data) {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve($http("/decision/product/doCalculation", data));
+      }, 10000);
+    });
+  },
+
+  // 活动转化相关接口
+  // 创建活动
+  addActivity(data) {
+    return $http("/activity/add", data);
+  },
+
+  // 获取活动详情
+  getActivityDetail(data) {
+    return $http("/activity/detail", data);
+  },
+
+  //获取活动列表
+  getActivityList(data) {
+    return $http("/activity/list", data);
+  },
+
+  // 下载数据分析
+  downloadAnalysis(data) {
+    return $http("/activity/downloadAnalysis", data);
+  },
+
+  // 获取活动决策列表
+  getActivityDecsisionList(data) {
+    return $http("/activity/decsisionList", data);
+  },
+
+  // 店铺列表筛选城市
+  searchShopListCity(data) {
+    return $http("/shop/list/search/city", data);
+  },
+
+  // 店铺列表筛选店铺名称
+  searchShopListShopName(data) {
+    return $http("/shop/list/search/shopName", data);
+  },
+
+  // 店铺列表筛选店铺类型
+  searchShopListShopType(data) {
+    return $http("/shop/list/search/shopType", data);
+  },
+
+  // 使用量列表
+  getUsageList(data) {
+    return $http("/product/usage/list", data);
+  },
+
+  // 添加使用量
+  addUsage(data) {
+    return $http("/product/usage/add", data);
+  },
+
+  // 删除使用量
+  deleteUsage(data) {
+    return $http("/product/usage/delete", data);
+  },
+
+  // 修改使用量
+  updateUsage(data) {
+    return $http("/product/usage/update", data);
+  },
+
+  // 添加生命周期-选择商品分类模糊下拉
+  searchLifelineFamilySelect(data) {
+    return $http("/product/lifeline/familySelect", data);
+  },
+
+  // 添加生命周期-选择商品商品功能模糊下拉
+  searchLifelineFunctionSelect(data) {
+    return $http("/product/lifeline/functionSelect", data);
+  },
+
+  // 获取生命线
+  getThinkTankLifeline(data) {
+    return $http("/product/lifeline/showLifeLine", data);
+  },
+
+  suc(res) {
+    ElNotification({
+      type: "success",
+      message: res.data.msg,
+      title: "Success!",
+    });
+  },
+  err(res) {
+    ElNotification({
+      type: "error",
+      message: res.data.msg,
+    });
+    console.log(res);
+  },
+};

ファイルの差分が大きいため隠しています
+ 0 - 0
src/assets/echarts.min.js


BIN
src/assets/user.png


+ 8 - 0
src/components/Header.vue

@@ -0,0 +1,8 @@
+<template>Header</template>
+
+<script>
+export default {};
+</script>
+
+<style>
+</style>

+ 29 - 0
src/layout/AppMain.vue

@@ -0,0 +1,29 @@
+<template>
+  <section class="app-main">
+    <transition name="fade-transform" mode="out-in">
+      <keep-alive>
+        <router-view :key="key" />
+      </keep-alive>
+    </transition>
+  </section>
+</template>
+
+<script>
+import { useRoute } from "vue-router";
+
+export default {
+  setup() {
+    const route = useRoute();
+
+    function key() {
+      return route.path;
+    }
+
+    return {
+      key,
+    };
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 39 - 0
src/main.js

@@ -0,0 +1,39 @@
+import { createApp } from "vue";
+import ElementPlus from "element-plus";
+import "element-plus/dist/index.css";
+import App from "./App.vue";
+import router from "./router";
+import store from "./store";
+import md5 from "md5";
+import "./styles/index.scss";
+
+const app = createApp(App);
+
+router.beforeEach(async (to, from, next) => {
+  let id = localStorage.id;
+  if (id) {
+    store.commit("changeLogin", true);
+    if (0 === to.matched.length) {
+      next("/digitalEmpowermentCenter");
+    } else if (to.path == "/login") {
+      next("/digitalEmpowermentCenter");
+    } else {
+      next();
+    }
+  } else {
+    store.commit("changeLogin", false);
+    if (to.path == "/login") {
+      next();
+    } else if (0 === to.matched.length) {
+      next("/login");
+    } else {
+      next("/login");
+    }
+  }
+});
+router.afterEach((to, from) => {
+  let { title } = to.meta;
+  document.title = title;
+});
+
+app.use(router).use(ElementPlus).use(store).mount("#app");

+ 54 - 0
src/router/index.js

@@ -0,0 +1,54 @@
+import {
+  createWebHistory,
+  createWebHashHistory,
+  createMemoryHistory,
+  createRouter,
+} from "vue-router";
+
+const router = createRouter({
+  history: createWebHashHistory(),
+  routes: [
+    {
+      path: "/login",
+      name: "login",
+      meta: {
+        title: "登录",
+      },
+      component: () => import("../views/Login.vue"),
+    },
+    {
+      path: "/digitalEmpowermentCenter",
+      name: "digitalEmpowermentCenter",
+      meta: {
+        title: "Index",
+      },
+      component: () => import("../views/digitalEmpowermentCenter.vue"),
+    },
+    {
+      path: "/environmentalCenter",
+      name: "environmentalCenter",
+      meta: {
+        title: "Index",
+      },
+      component: () => import("../views/environmentalCenter.vue"),
+    },
+    {
+      path: "/intelligentTradingCenter",
+      name: "intelligentTradingCenter",
+      meta: {
+        title: "Index",
+      },
+      component: () => import("../views/intelligentTradingCenter.vue"),
+    },
+    {
+      path: "/transportationSafetyCenter",
+      name: "transportationSafetyCenter",
+      meta: {
+        title: "Index",
+      },
+      component: () => import("../views/transportationSafetyCenter.vue"),
+    },
+  ],
+});
+
+export default router;

+ 46 - 0
src/store/index.js

@@ -0,0 +1,46 @@
+import { createStore } from "vuex";
+
+const store = createStore({
+  state: {
+    isLogin: false,
+    firstTitle: "",
+    secondTitle: "",
+    currentMenuItem: "/index",
+    isLoading: false,
+  },
+  mutations: {
+    changefirstTitle(state, text) {
+      state.firstTitle = text;
+    },
+    changeTitleSecond(state, text) {
+      state.secondTitle = text;
+    },
+    changeLogin(state, b) {
+      state.isLogin = b;
+    },
+    setCurrentMenuItem(state, index) {
+      state.currentMenuItem = index;
+    },
+    changeLoading(state, b) {
+      state.isLoading = b;
+    },
+  },
+  actions: {
+    Login({ commit }, userInfo) {
+      return new Promise((resolve, reject) => {
+        localStorage.setItem("id", 1);
+        commit("changeLogin", true);
+        resolve(1);
+      });
+    },
+    LogOut({ commit }) {
+      return new Promise((resolve, reject) => {
+        commit("changeLogin", false);
+        localStorage.removeItem("id");
+        resolve(0);
+      });
+    },
+  },
+});
+
+export default store;

+ 206 - 0
src/styles/index.scss

@@ -0,0 +1,206 @@
+@import 'transition';
+
+
+.tac {
+  text-align: center;
+}
+
+.tar {
+  text-align: right;
+}
+
+.tal{
+  text-align: left;
+}
+
+
+.df {
+  display: flex;
+}
+
+.ffw {
+  flex-flow: wrap;
+}
+
+.jcsa {
+  justify-content: space-around;
+}
+.jcsb {
+  justify-content: space-between;
+}
+
+.jcfe {
+  justify-content: flex-end;
+}
+
+.jcc {
+  justify-content: center;
+}
+
+.aic {
+  align-items: center;
+}
+
+
+.aifs {
+  align-items: flex-start;
+}
+
+.dib {
+  display: inline-block;
+}
+
+
+.pointer {
+  cursor: pointer;
+}
+
+.m0a{
+  margin: 0 auto;
+}
+
+.mt5{
+  margin-top: 5px;
+}
+
+.mt10{
+  margin-top: 10px;
+}
+
+.mt20{
+  margin-top: 20px;
+}
+
+.mt30{
+  margin-top: 30px;
+}
+
+.mr5{
+  margin-right: 5px;
+}
+
+.mr10{
+  margin-right: 10px;
+}
+
+.mr20{
+  margin-right: 20px;
+}
+
+.mr30{
+  margin-right: 30px;
+}
+
+.mb5{
+  margin-bottom: 5px;
+}
+
+.mb10{
+  margin-bottom: 10px;
+}
+
+.mb20{
+  margin-bottom: 20px;
+}
+
+.mb30{
+  margin-bottom: 30px;
+}
+
+.ml5{
+  margin-left: 5px;
+}
+
+.ml10{
+  margin-left: 10px;
+}
+
+.ml20{
+  margin-left: 20px;
+}
+
+.ml30{
+  margin-left: 30px;
+}
+
+.p5{
+  padding: 5px;
+}
+
+.p10{
+  padding: 10px;
+}
+
+.p20{
+  padding: 20px;
+}
+
+.p30{
+  padding: 30px;
+}
+
+.pt5{
+  padding-top: 5px;
+}
+
+.pt10{
+  padding-top: 10px;
+}
+
+.pt20{
+  padding-top: 20px;
+}
+
+.pt30{
+  padding-top: 30px;
+}
+
+.pr5{
+  padding-right: 5px;
+}
+
+.pr10{
+  padding-right: 10px;
+}
+
+.pr20{
+  padding-right: 20px;
+}
+
+.pr30{
+  padding-right: 30px;
+}
+
+.pb5{
+  padding-bottom: 5px;
+}
+
+.pb10{
+  padding-bottom: 10px;
+}
+
+.pb20{
+  padding-bottom: 20px;
+}
+
+.pb30{
+  padding-bottom: 30px;
+}
+
+.pl5{
+  padding-left: 5px;
+}
+
+.pl10{
+  padding-left: 10px;
+}
+
+.pl20{
+  padding-left: 20px;
+}
+
+.pl30{
+  padding-left: 30px;
+}
+
+

+ 48 - 0
src/styles/transition.scss

@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+  opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+  transition: all .5s;
+}
+
+.fade-transform-enter {
+  opacity: 0;
+  transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+  opacity: 0;
+  transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+  transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+  opacity: 0;
+  transform: translateX(20px);
+}
+
+.breadcrumb-move {
+  transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+  position: absolute;
+}

+ 0 - 0
src/utils/auth.js


+ 45 - 0
src/utils/downloadBlobFile.js

@@ -0,0 +1,45 @@
+import axios from "axios";
+import { ElNotification, ElMessageBox, ElMessage } from "element-plus";
+
+function downloadBlobFile(url, data, name, type) {
+  return new Promise((resolve, reject) => {
+    axios({
+      method: type,
+      url,
+      responseType: "blob",
+      data,
+    })
+      .then((res) => {
+        if (res.data.size == 30) {
+          ElNotification({
+            type: "error",
+            title: "暂无分析数据",
+          });
+          reject({
+            status: 1,
+          });
+        } else {
+          let blob = new Blob([res.data], {
+            type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8",
+          });
+          let downloadElement = document.createElement("a");
+          let href = window.URL.createObjectURL(blob); // 创建下载的链接
+          downloadElement.href = href;
+          downloadElement.download = name; // 下载后文件名
+          document.body.appendChild(downloadElement);
+          downloadElement.click(); // 点击下载
+          document.body.removeChild(downloadElement); // 下载完成移除元素
+          window.URL.revokeObjectURL(href); // 释放掉blob对象
+          resolve({
+            status: 0,
+          });
+        }
+      })
+      .catch((e) => {
+        reject({
+          status: 1,
+        });
+      });
+  });
+}
+export default downloadBlobFile;

+ 15 - 0
src/views/digitalEmpowermentCenter.vue

@@ -0,0 +1,15 @@
+<template>
+  <el-button>digitalEmpowermentCenter - 数字化赋能中心</el-button>
+</template>
+
+<script>
+import router from "router/index";
+export default {
+  setup() {
+    return {};
+  },
+};
+</script>
+
+<style>
+</style>

+ 15 - 0
src/views/environmentalCenter.vue

@@ -0,0 +1,15 @@
+<template>
+  <el-button>environmentalCenter - 环境中心</el-button>
+</template>
+
+<script>
+import router from "router/index";
+export default {
+  setup() {
+    return {};
+  },
+};
+</script>
+
+<style>
+</style>

+ 16 - 0
src/views/intelligentTradingCenter.vue

@@ -0,0 +1,16 @@
+
+<template>
+  <el-button>intelligentTradingCenter - 智能交易中心</el-button>
+</template>
+
+<script>
+import router from "router/index";
+export default {
+  setup() {
+    return {};
+  },
+};
+</script>
+
+<style>
+</style>

+ 25 - 0
src/views/login.vue

@@ -0,0 +1,25 @@
+<template>
+  <el-button @click="login">登录</el-button>
+</template>
+
+<script>
+import router from "router/index";
+import store from "store/index";
+
+export default {
+  setup() {
+    async function login() {
+      let res = await store.dispatch("Login");
+      if (res == 1) {
+        router.replace("/digitalEmpowermentCenter");
+      }
+    }
+    return {
+      login,
+    };
+  },
+};
+</script>
+
+<style>
+</style>

+ 15 - 0
src/views/transportationSafetyCenter.vue

@@ -0,0 +1,15 @@
+<template>
+  <el-button>transportationSafetyCenter - 运输安全管理中心</el-button>
+</template>
+
+<script>
+import router from "router/index";
+export default {
+  setup() {
+    return {};
+  },
+};
+</script>
+
+<style>
+</style>

+ 23 - 0
vite.config.js

@@ -0,0 +1,23 @@
+import { defineConfig } from "vite";
+import vue from "@vitejs/plugin-vue";
+import path from "path";
+import viteCompression from "vite-plugin-compression";
+
+// https://vitejs.dev/config/
+export default defineConfig({
+  plugins: [vue(), viteCompression()],
+  resolve: {
+    alias: {
+      "@": path.resolve(__dirname, "src"),
+      comps: path.resolve(__dirname, "src/components"),
+      apis: path.resolve(__dirname, "src/apis"),
+      router: path.resolve(__dirname, "src/router"),
+      store: path.resolve(__dirname, "src/store"),
+      views: path.resolve(__dirname, "src/views"),
+      utils: path.resolve(__dirname, "src/utils"),
+    },
+  },
+  server: {
+    port: 5678,
+  },
+});

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません