陈远志 %!s(int64=6) %!d(string=hai) anos
pai
achega
dc42064c6f

+ 10 - 4
front_end/package-lock.json

@@ -2130,11 +2130,12 @@
       "integrity": "sha1-fjPY99RJs/ZzzXLeuavcVS2+Uo4="
     },
     "axios": {
-      "version": "0.19.2",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
-      "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
+      "version": "0.19.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
+      "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
       "requires": {
-        "follow-redirects": "1.5.10"
+        "follow-redirects": "1.5.10",
+        "is-buffer": "^2.0.2"
       },
       "dependencies": {
         "debug": {
@@ -2153,6 +2154,11 @@
             "debug": "=3.1.0"
           }
         },
+        "is-buffer": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
+        },
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",

+ 1 - 1
front_end/package.json

@@ -9,7 +9,7 @@
   },
   "dependencies": {
     "ant-design-vue": "^1.4.11",
-    "axios": "^0.19.2",
+    "axios": "^0.19.0",
     "core-js": "^3.6.4",
     "js-cookie": "^2.2.1",
     "less": "^3.11.1",

+ 1 - 0
front_end/src/api/admin.js

@@ -0,0 +1 @@
+import { axios } from '@/utils/request'

+ 0 - 11
front_end/src/api/chart.js

@@ -1,11 +0,0 @@
-import { axios } from '@/utils/request'
-const api = {
-    chartPre: 'api/chart'
-}
-export function getCommentCountBarChartAPI(params) {
-    return axios({
-        url: `${api.chartPre}/getCommentCountBarChart`,
-        method: 'GET',
-        params
-    })
-}

+ 0 - 61
front_end/src/api/comment.js

@@ -1,61 +0,0 @@
-import {axios} from '@/utils/request'
-
-const api = {
-    commentPre: 'api/comment'
-}
-//根据电影ID删除评论
-export function deleteByCommentIdAPI(params){
-    return axios({
-        url: `${api.commentPre}/deleteByCommentId`,
-        method: 'GET',
-        params
-    })
-}
-//根据评论ID删除评论
-export function deleteByMovieIdAPI(params){
-    return axios({
-        url: `${api.commentPre}/deleteByMovieId`,
-        method: 'GET',
-        params
-    })
-}
-//用户添加新的电影评论
-export function insertCommentAPI(data){
-    return axios({
-        url: `${api.commentPre}/insertComment`,
-        method: 'POST',
-        data
-    })
-}
-//根据电影及父评论,查找子评论回复
-export function listReplyCommentOfRootCommentAPI(params){
-    return axios({
-        url: `${api.commentPre}/listReplyCommentOfRootComment`,
-        method: 'GET',
-        params
-    })
-}
-//获取电影的主评论列表
-export function listRootCommentByMovieIdAPI(params){
-    return axios({
-        url: `${api.commentPre}/listRootCommentByMovieId`,
-        method: 'GET',
-        params
-    })
-}
-//获取用户发出的评论    
-export function listUserPostCommentsAPI(params){
-    return axios({
-        url: `${api.commentPre}/listUserPostComments`,
-        method: 'GET',
-        params
-    })
-}
-//获取用户收到的评论
-export function listUserReceiveCommentsAPI(params){
-    return axios({
-        url: `${api.commentPre}/listUserReceiveComments`,
-        method: 'GET',
-        params
-    })
-}

+ 7 - 0
front_end/src/api/hotel.js

@@ -0,0 +1,7 @@
+import { axios } from '@/utils/request'
+export function getHotelsAPI() {
+    return axios({
+        url: '/api/hotel/all',
+        method: 'get'
+    })
+}

+ 0 - 0
front_end/src/api/hotelManager.js


+ 0 - 39
front_end/src/api/movie.js

@@ -1,39 +0,0 @@
-import { axios } from '@/utils/request'
-
-const api = {
-    moviePre: 'api/movie',
-}
-
-export function getMovieListAPI(params){
-    return axios({
-        url: `${api.moviePre}/listByTag`,
-        method: 'GET',
-        params
-    })
-}
-
-export function getByMovieIdAPI(params){
-    return axios({
-        url: `${api.moviePre}/getByMovieId`,
-        method: 'GET',
-        params
-    })
-}
-
-//获取电影数量
-export function getCountOfMoviesAPI(params){
-    return axios({
-        url: `${api.moviePre}/getCountOfMovies`,
-        method: 'GET',
-        params
-    })
-}
-
-//搜索
-export function searchByKeywordAPI(params){
-    return axios({
-        url: `${api.moviePre}/searchByKeyword`,
-        method: 'GET',
-        params
-    })
-}

+ 0 - 12
front_end/src/api/rate.js

@@ -1,12 +0,0 @@
-import { axios } from '@/utils/request'
-const api = {
-    ratePre: '/api/rate'
-}
-
-export function insertOrUpdateRateAPI(data){
-    return axios({
-        url: `${api.ratePre}/insertOrUpdateRate`,
-        method: 'POST',
-        data
-    })
-}

+ 0 - 10
front_end/src/api/tag.js

@@ -1,10 +0,0 @@
-import { axios } from '@/utils/request'
-const api = {
-    tagPre: 'api/tag',
-}
-export function getTagsMapAPI() {
-    return axios({
-        url: `${api.tagPre}/getTagsMap`,
-        method: 'GET'
-    })
-}

+ 1 - 1
front_end/src/api/user.js

@@ -5,7 +5,7 @@ const api = {
 }
 export function loginAPI(data){
     return axios({
-        url:`${api.userPre}/login`,
+        url:`/api/login`,
         method: 'POST',
         data
     })

+ 33 - 7
front_end/src/components/header.vue

@@ -6,11 +6,26 @@
             
         </div>
         <a-menu v-model="current" mode="horizontal" theme="light">
-            <a-menu-item key="1"> <a-icon type="home" />首页</a-menu-item>
-            <a-menu-item key="2"> <a-icon type="user" />个人中心</a-menu-item>
-            <a-menu-item key="3"> <a-icon type="switcher" />房间管理</a-menu-item>
-            <a-menu-item key="4"> <a-icon type="file" />订单管理</a-menu-item>
-            
+            <a-menu-item key="1" @click="selectMenu">
+                <router-link to="/hotel/hotelList">
+                    <a-icon type="home" />首页
+                </router-link>
+            </a-menu-item>
+            <a-menu-item key="2" @click="selectMenu">
+                <router-link :to="{ name: 'userInfo'}">
+                    <a-icon type="user" />个人中心
+                </router-link>
+            </a-menu-item>
+            <a-menu-item key="3" @click="selectMenu">
+                <router-link :to="{ name: 'manageHotel'}">
+                     <a-icon type="switcher" />酒店管理
+                </router-link>
+            </a-menu-item>
+            <a-menu-item key="4" @click="selectMenu">
+                <router-link :to="{ name: 'manageUser'}">
+                     <a-icon type="user" />账户管理
+                </router-link>
+            </a-menu-item>
         </a-menu>
         <div class="logout">
             <a-dropdown placement="bottomCenter">
@@ -55,8 +70,16 @@ export default {
         ])
     },
     mounted() {
-        
-        },
+        if (this.$route.name == 'hotelList' || this.$route.name == 'hotelDetail') {
+            this.current = ['1']
+        }else if(this.$route.name == 'userInfo') {
+            this.current = ['2']
+        }else if(this.$route.name == 'manageHotel') {
+            this.current = ['3']
+        }else {
+            this.current = ['4']
+        }
+    },
     methods: {
         ...mapMutations([
 
@@ -64,6 +87,9 @@ export default {
         ...mapActions([
             'logout'
         ]),
+        selectMenu(v){
+            console.log(v)
+        },
         onSearch(v) {
             if(this.$route.query.keyword != v){
                 // this.$router.push({ name: 'search', query: { keyword: v } })

+ 34 - 34
front_end/src/router/index.js

@@ -1,8 +1,8 @@
 import Vue from 'vue'
 import VueRouter from 'vue-router'
-import Login from '../views/user/login.vue'
-Vue.use(VueRouter)
+import Login from '../views/login.vue'
 
+Vue.use(VueRouter)
 const routes = [
   {
     path: '/login',
@@ -11,41 +11,41 @@ const routes = [
   },
   {
     path: '/',
+    redirect: '/NJUSE'
   },
   {
-    path: '/home',
+    path: '/NJUSE',
     name: 'layout',
-    component: ()=> import('@/views/layout')
-  }
-  // {
-  //   path: '/movie',
-  //   name: 'layout',
-  //   redirect: '/movie/list',
-  //   component: () => import('@/views/layout'),
-  //   children: [
-  //     {
-  //       path: '/movie/list',
-  //       name: 'list',
-  //       component: ()=> import('@/views/movie/movieList')
-  //     },
-  //     {
-  //       path: '/movie/movieDetail/:movieId',
-  //       name: 'movieDetail',
-  //       component: () => import('@/views/movie/movieDetail')
-  //     },
-  //     {
-  //       path: '/movie/search',
-  //       name: 'search',
-  //       component: () => import('@/views/movie/searchMovie')
-  //     },
-  //     {
-  //       path: '/user/info/:userId',
-  //       name: 'info',
-  //       component: () => import('@/views/user/info')
-  //     }
-  //   ]
-  // }
-
+    redirect: '/hotel/hotelList',
+    component: ()=> import('@/views/layout'),
+    children: [
+      {
+        path: '/hotel/hotelList',
+        name: 'hotelList',
+        component: () => import('@/views/hotel/hotelList')
+      },
+      {
+        path: 'hotel/hotelDetail/:hotelId',
+        name: 'hotelDetail',
+        component: () => import('@/views/hotel/hotelDetail')
+      },
+      {
+        path: '/user/info/:userId',
+        name: 'userInfo',
+        component: () => import('@/views/user/info')
+      },
+      {
+        path: '/hotelManager/manageHotel',
+        name: 'manageHotel',
+        component: () => import('@/views/hotelManager/manageHotel')
+      },
+      {
+        path: '/admin/manageUser',
+        name: 'manageUser',
+        component: () => import('@/views/admin/manageUser')
+      },
+    ]
+  },
 ]
 const createRouter = () => new VueRouter({
   // mode: 'history', // require service support

+ 2 - 0
front_end/src/store/index.js

@@ -1,11 +1,13 @@
 import Vue from 'vue'
 import Vuex from 'vuex'
 import user from './modules/user'
+import hotel from './modules/hotel'
 import getters from './getters'
 Vue.use(Vuex)
 
 export default new Vuex.Store({
   modules: {
+    hotel,
     user,
   },
   state: {

+ 15 - 0
front_end/src/store/modules/hotel.js

@@ -0,0 +1,15 @@
+import {
+    getHotelsAPI
+} from '@/api/hotel'
+const hotel = {
+    state: {
+
+    },
+    actions: {
+        getHotelList: async({ state }) => {
+            const res = await getHotelsAPI()
+            console.log(res)
+        }
+    }
+}
+export default hotel

+ 1 - 0
front_end/src/store/modules/user.js

@@ -46,6 +46,7 @@ const user = {
     actions: {
         login: async ({ commit }, userData) => {
             const res = await loginAPI(userData)
+            console.log(res)
             if(res){
                 setToken(res)
                 // Vue.ls.set('ACCESS_TOKEN', res, 7 * 24 * 60 * 60 * 1000)

+ 6 - 1
front_end/src/utils/axios.js

@@ -23,7 +23,12 @@ const VueAxios = {
                 get:function get() {
                     return instance
                 }
-            } 
+            },
+            $https: {
+                get:function get() {
+                    return instance
+                }
+            }  
         })
     }
 }

+ 58 - 59
front_end/src/utils/request.js

@@ -8,71 +8,70 @@ import router from '../router'
 
 // 创建 axios 实例
 const service = axios.create({
-  baseURL: 'http://localhost:45032/MovieTubeServer',
+  baseURL: 'http://localhost:8080',
   withCredentials: true
 })
 
- const err = (error) => { 
-  if (error.response) {
-    const data = error.response.data
-    const token = Vue.ls.get('ACCESS_TOKEN')
-    if (error.response.status === 403) {
-      notification.error({
-        message: 'Forbidden',
-        description: data.message
-      })
-    }
-    if (error.response.status === 401 && !(data.result && data.result.isLogin)) {
-      notification.error({
-        message: 'Unauthorized',
-        description: 'Authorization verification failed'
-      })
-      if (token) {
-        store.dispatch('Logout').then(() => {
-          setTimeout(() => {
-            window.location.reload()
-          }, 1500)
-        })
-      }
-    }
-  }
-  return Promise.reject(error)
- }
+//  const err = (error) => { 
+//   if (error.response) {
+//     const data = error.response.data
+//     const token = Vue.ls.get('ACCESS_TOKEN')
+//     if (error.response.status === 403) {
+//       notification.error({
+//         message: 'Forbidden',
+//         description: data.message
+//       })
+//     }
+//     if (error.response.status === 401 && !(data.result && data.result.isLogin)) {
+//       notification.error({
+//         message: 'Unauthorized',
+//         description: 'Authorization verification failed'
+//       })
+//       if (token) {
+//         store.dispatch('Logout').then(() => {
+//           setTimeout(() => {
+//             window.location.reload()
+//           }, 1500)
+//         })
+//       }
+//     }
+//   }
+//   return Promise.reject(error)
+//  }
 
 
-//request incerceptor
-service.interceptors.request.use((config) => {
-  if (store.getters.token) {
-    config.headers['Authorization'] = getToken()
-  }
-  const requestConfig = {
-    ...config,
-    url: `${config.url}`,
-    withCredentials: true
-  }
-  return requestConfig
-}, err)
+// //request incerceptor
+// service.interceptors.request.use((config) => {
+//   if (store.getters.token) {
+//     config.headers['Authorization'] = getToken()
+//   }
+//   const requestConfig = {
+//     ...config,
+//     url: `${config.url}`,
+//   }
+//   return requestConfig
+// }, err)
 
-service.interceptors.response.use((response) => {
-  switch (response.status) {
-    case 200:
-      switch (response.data.returnCode) {
-        case 200:
-          return response.data.data
-        default:
-          if(response.data.message){
-            message.error(response.data.message)
-          }
-      }
-      break
-    case 404:
-      return false
-    default:
-      if(response.data.message){
-        message.error(response.data.message)
-      }
-  }
-})
+// service.interceptors.response.use((response) => {
+//   switch (response.status) {
+//     case 200:
+//       switch (response.data.returnCode) {
+//         case 200:
+//           return response.data.data
+//         default:
+//           if(response.data.message){
+//             message.error(response.data.message)
+//           }
+//       }
+//       break
+//     case 404:
+//       return false
+//     default:
+//       if(response.data.message){
+//         message.error(response.data.message)
+//       }
+//   }
+// })
 
 const installer = {
   vm: {},

+ 19 - 0
front_end/src/views/admin/manageUser.vue

@@ -0,0 +1,19 @@
+<template>
+    <div>manageUser</div>
+</template>
+<script>
+export default {
+    name: 'manageUser',
+    data() {
+        return{
+            
+        }
+    },
+    mounted(){
+
+    }
+}
+</script>
+<style scoped>
+
+</style>

+ 19 - 0
front_end/src/views/hotel/hotelDetail.vue

@@ -0,0 +1,19 @@
+<template>
+    <div>hotelDetail</div>
+</template>
+<script>
+export default {
+    name: 'hotelDetail',
+    data() {
+        return {
+
+        }
+    },
+    mounted(){
+
+    }
+}
+</script>
+<style scoped>
+
+</style>

+ 25 - 0
front_end/src/views/hotel/hotelList.vue

@@ -0,0 +1,25 @@
+<template>
+    <div>hotelList</div>
+</template>
+<script>
+import { mapActions } from 'vuex'
+export default {
+    name: 'hotelList',
+    data() {
+        return {
+
+        }
+    },
+    mounted(){
+        this.getHotelList()
+    },
+    methods: {
+        ...mapActions([
+            'getHotelList'
+        ])
+    }
+}
+</script>
+<style scoped>
+
+</style>

+ 19 - 0
front_end/src/views/hotelManager/manageHotel.vue

@@ -0,0 +1,19 @@
+<template>
+    <div>manageHotel</div>
+</template>
+<script>
+export default {
+    name: 'manageHotel',
+    data() {
+        return {
+            
+        }
+    },
+    mounted(){
+
+    }
+}
+</script>
+<style scoped>
+
+</style>

+ 0 - 0
front_end/src/views/user/login.vue → front_end/src/views/login.vue


+ 0 - 15
front_end/src/views/page.vue

@@ -1,15 +0,0 @@
-<template>
-    <Header></Header>
-</template>
-<script>
-import Header from '@/components/Header'
-export default {
-    name: 'home',
-    components: {
-
-    },
-    data() {
-
-    }
-}
-</script>

+ 202 - 0
front_end/src/views/user/info.vue

@@ -0,0 +1,202 @@
+<template>
+    <div class="info-wrapper">
+        <a-tabs>
+            <a-tab-pane tab="我的信息" key="1">
+                <a-form :form="form" style="margin-top: 30px">
+                    <a-form-item label="头像" :label-col="{ span: 3 }" :wrapper-col="{ span: 8, offset: 1 }">
+                        <a-avatar src="./defaultAvatar.png" :size="64"></a-avatar>
+                    </a-form-item>
+                    <a-form-item label="用户名" :label-col="{ span: 3 }" :wrapper-col="{ span: 8, offset: 1  }">
+                        <a-input
+                            placeholder="请填写用户名"
+                            v-decorator="['username', { rules: [{ required: true, message: '请输入用户名' }] }]"
+                            v-if="modify"
+                        />
+                        <span v-else>{{ userInfo.username }}</span>
+                    </a-form-item>
+                    <a-form-item label="昵称" :label-col="{ span: 3 }" :wrapper-col="{ span: 8, offset: 1  }">
+                        <a-input
+                            placeholder="请填写昵称"
+                            v-decorator="['nickname', { rules: [{ required: true, message: '请输入昵称' }] }]"
+                            v-if="modify"
+                        />
+                        <span v-else>{{ userInfo.nickname }}</span>
+                    </a-form-item>
+                    <a-form-item label="邮箱" :label-col="{ span: 3 }" :wrapper-col="{ span: 8, offset: 1 }">
+                        <a-input
+                            placeholder="请填写邮箱"
+                            v-decorator="['email', { rules: [{ required: true, message: '请输入邮箱' }] }]"
+                            v-if="modify"
+                        />
+                        <span v-else>{{ userInfo.email }}</span>
+                    </a-form-item>
+                    <a-form-item label="性别" :label-col="{ span: 3 }" :wrapper-col="{ span: 8, offset: 1 }">
+                        <a-select
+                            v-decorator="[
+                            'gender',
+                            { rules: [{ required: true, message: '请选择性别!' }] },
+                            ]"
+                            v-if="modify"
+                            placeholder="请选择性别"
+                        >
+                            <a-select-option value="male">
+                            男生
+                            </a-select-option>
+                            <a-select-option value="female">
+                            女生
+                            </a-select-option>
+                        </a-select>
+                        <span v-else>{{ userInfo.gender }}</span>
+                    </a-form-item>
+                    <a-form-item label="手机号" :label-col="{ span: 3 }" :wrapper-col="{ span: 8, offset: 1 }">
+                        <a-input
+                            placeholder="请填写手机号"
+                            v-decorator="['phoneNumber', { rules: [{ required: true, message: '请输入手机号' }] }]"
+                            v-if="modify"
+                        />
+                        <span v-else>{{ userInfo.phoneNumber}}</span>
+                    </a-form-item>
+                    <a-form-item label="地址" :label-col="{ span: 3 }" :wrapper-col="{ span: 8, offset: 1 }">
+                        <a-input
+                            type="textarea"
+                            placeholder="请填写地址"
+                            v-decorator="['address']"
+                            v-if="modify"
+                        />
+                        <span v-else>{{ userInfo.address }}</span>
+                    </a-form-item>
+                   
+                    <a-form-item :wrapper-col="{ span: 12, offset: 5 }" v-if="modify">
+                        <a-button type="primary" @click="saveModify">
+                            保存
+                        </a-button>
+                        <a-button type="default" style="margin-left: 30px" @click="cancelModify">
+                            取消
+                        </a-button>
+                    </a-form-item>
+                     <a-form-item :wrapper-col="{ span: 8, offset: 4 }" v-else>
+                        <a-button type="primary" @click="modifyInfo">
+                            修改信息
+                        </a-button>
+                    </a-form-item>
+                </a-form>
+            </a-tab-pane>
+            <a-tab-pane tab="我发表的评论" key="2">
+                <div class="chart">
+                    <bar-chart type="bar" title="评论数柱状图"></bar-chart>
+                    <bar-chart type="line" title="评论数折线图"></bar-chart>
+                </div>
+                <a-divider></a-divider>
+                <h1>详细数据</h1>
+                <a-table
+                    rowKey="{record => record.id}"
+                    :loading="postLoading"
+                    :columns="postCommentsColumns"
+                    :dataSource="postCommentsList.content"
+                    :pagination="{ pageSize: 10 }"
+                >
+                
+                    <a slot="movieName" slot-scope="record">{{ record }}</a>
+                    <span slot="directors" slot-scope="record">{{ record.join(',') }}</span>
+                </a-table>
+            </a-tab-pane>
+            <a-tab-pane tab="我收到的评论" key="3">
+                <a-table
+                    rowKey="{record => record.id}"
+                    :loading="receiveLoading"
+                    :columns="receiveCommentsColumns"
+                    :dataSource="receiveCommentsList.content"
+                    :pagination="{ pageSize: 10 }"
+                >
+                    <a slot="movieName" slot-scope="record">{{ record }}</a>
+                    <span slot="directors" slot-scope="record">{{ record.join(',') }}</span>
+                </a-table>
+            </a-tab-pane>
+        </a-tabs>
+        
+    </div>
+</template>
+<script>
+import { mapGetters, mapMutations, mapActions } from 'vuex'
+export default {
+    name: 'info',
+    data(){
+        return {
+            modify: false,
+            formLayout: 'horizontal',
+            pagination: {},
+            form: this.$form.createForm(this, { name: 'coordinated' }),
+        }
+    },
+    components: {
+    },
+    computed: {
+        ...mapGetters([
+            'userInfo',
+        ])
+    },
+    mounted() {
+
+    },
+    methods: {
+        ...mapActions([
+            'updateUserInfoById',
+        ]),
+        saveModify() {
+            this.form.validateFields((err, values) => {
+                if (!err) {
+                    const data = {
+                        username: this.form.getFieldValue('username'),
+                        nickname: this.form.getFieldValue('nickname'),
+                        email: this.form.getFieldValue('email'),
+                        phoneNumber: this.form.getFieldValue('phoneNumber'),
+                        gender: this.form.getFieldValue('gender'),
+                        address: this.form.getFieldValue('address')
+                    }
+                    this.updateUserInfoById(data).then(()=>{
+                        this.modify = false
+                    })
+                }
+            });
+        },
+        modifyInfo() {
+            setTimeout(() => {
+                this.form.setFieldsValue({
+                    'username': this.userInfo.username,
+                    'nickname': this.userInfo.nickname,
+                    'email': this.userInfo.email,
+                    'phoneNumber': this.userInfo.phoneNumber,
+                    'gender': this.userInfo.gender,
+                    'address': this.userInfo.address
+                })
+            }, 0)
+            this.modify = true
+        },
+        cancelModify() {
+            this.modify = false
+        }
+        
+    }
+}
+</script>
+<style scoped lang="less">
+    .info-wrapper {
+        padding: 50px 0 0;
+        .chart {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            margin-top: 20px
+        }
+    }
+</style>
+<style lang="less">
+    .info-wrapper {
+        .ant-tabs-bar {
+            padding-left: 30px
+        }
+    }
+</style>
+<style lang="less">
+    
+</style>

+ 0 - 0
front_end/vue.config.js