Jelajahi Sumber

修改内容,使其可以内嵌至项目中

lsh 1 bulan lalu
induk
melakukan
4a9f09c646

+ 2 - 2
.env.development

@@ -2,10 +2,10 @@
 ENV = 'development'
 
 # base api
-VUE_APP_BASE_API = '/dev-api'
+VUE_APP_BASE_API = 'http://127.0.0.1:8080/etl'
 
 # no mock api
-VUE_APP_API = '/dev-api/api'
+VUE_APP_API = ''
 
 # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
 # to control whether the babel-plugin-dynamic-import-node plugin is enabled.

+ 4 - 1
.env.production

@@ -2,4 +2,7 @@
 ENV = 'production'
 
 # base api
-VUE_APP_BASE_API = '/'
+VUE_APP_BASE_API = ''
+
+# no mock api
+VUE_APP_API = '/etl'

+ 1 - 12
src/layout/index.vue

@@ -1,17 +1,6 @@
 <template>
   <div :class="classObj" class="app-wrapper">
-    <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
-    <sidebar class="sidebar-container" />
-    <div :class="{hasTagsView:needTagsView}" class="main-container">
-      <div :class="{'fixed-header':fixedHeader}">
-        <navbar />
-        <tags-view v-if="needTagsView" />
-      </div>
-      <app-main />
-      <right-panel v-if="showSettings">
-        <settings />
-      </right-panel>
-    </div>
+    <app-main />
   </div>
 </template>
 

+ 41 - 28
src/permission.js

@@ -1,51 +1,46 @@
 import router from './router'
 import store from './store'
 import { Message } from 'element-ui'
-import NProgress from 'nprogress' // progress bar
-import 'nprogress/nprogress.css' // progress bar style
-import { getToken } from '@/utils/auth' // get token from cookie
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import { getToken } from '@/utils/auth'
 import getPageTitle from '@/utils/get-page-title'
 
-NProgress.configure({ showSpinner: false }) // NProgress Configuration
+NProgress.configure({ showSpinner: false })
 
-const whiteList = ['/login', '/auth-redirect'] // no redirect whitelist
+const whiteList = ['/login', '/auth-redirect']
 
 router.beforeEach(async(to, from, next) => {
-  // start progress bar
   NProgress.start()
-
-  // set page title
   document.title = getPageTitle(to.meta.title)
 
-  // determine whether the user has logged in
-  const hasToken = getToken()
+  // 关键修改1:对 getToken() 返回值判空,避免 null 后续被操作
+  const hasToken = getToken() || ''
 
   if (hasToken) {
     if (to.path === '/login') {
-      // if is logged in, redirect to the home page
       next({ path: '/' })
       NProgress.done()
     } else {
-      // determine whether the user has obtained his permission roles through getInfo
-      const hasRoles = store.getters.roles && store.getters.roles.length > 0
+      // 关键修改2:对 roles 判空,避免 null 调用 length
+      const hasRoles = Array.isArray(store.getters.roles) && store.getters.roles.length > 0
       if (hasRoles) {
         next()
       } else {
         try {
-          // get user info
-          // note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
-          const { roles } = await store.dispatch('user/getInfo')
-          // generate accessible routes map based on roles
+          // 关键修改3:解构时给 roles 赋默认值,避免返回 null
+          const { roles = [] } = await store.dispatch('user/getInfo')
+
+          // 关键修改4:确保 roles 是数组再传入
           const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
 
-          // dynamically add accessible routes
-          router.addRoutes(accessRoutes)
+          // 关键修改5:对 accessRoutes 判空,避免 addRoutes 传入 null/undefined
+          if (Array.isArray(accessRoutes) && accessRoutes.length) {
+            router.addRoutes(accessRoutes)
+          }
 
-          // hack method to ensure that addRoutes is complete
-          // set the replace: true, so the navigation will not leave a history record
           next({ ...to, replace: true })
         } catch (error) {
-          // remove token and go to login page to re-login
           await store.dispatch('user/resetToken')
           Message.error(error || 'Has Error')
           next(`/login?redirect=${to.path}`)
@@ -54,13 +49,32 @@ router.beforeEach(async(to, from, next) => {
       }
     }
   } else {
-    /* has no token*/
-
     if (whiteList.indexOf(to.path) !== -1) {
-      // in the free login whitelist, go directly
-      next()
+      try {
+        const loginForm = {
+          username: 'admin',
+          password: '123456'
+        }
+
+        // 关键修改6:登录后再次校验 token,避免返回 null
+        await store.dispatch('user/login', loginForm)
+        const newToken = getToken()
+        if (!newToken) {
+          throw new Error('登录失败:未获取到 token')
+        }
+
+        const redirect = to.query.redirect || '/'
+        const otherQuery = { ...to.query }
+        delete otherQuery.redirect
+
+        next({ path: redirect, query: otherQuery, replace: true })
+      } catch (error) {
+        Message.error(error.message || '登录失败,请重试')
+        next()
+      } finally {
+        NProgress.done()
+      }
     } else {
-      // other pages that do not have permission to access are redirected to the login page.
       next(`/login?redirect=${to.path}`)
       NProgress.done()
     }
@@ -68,6 +82,5 @@ router.beforeEach(async(to, from, next) => {
 })
 
 router.afterEach(() => {
-  // finish progress bar
   NProgress.done()
 })

+ 1 - 1
src/utils/request.js

@@ -5,7 +5,7 @@ import { getToken } from '@/utils/auth'
 
 // create an axios instance
 const service = axios.create({
-  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
+  baseURL: process.env.VUE_APP_BASE_API + process.env.VUE_APP_API, // url = base url + request url
   // withCredentials: true, // send cookies when cross-domain requests
   timeout: 20000 // request timeout
 })

+ 26 - 3
src/views/dashboard/admin/components/PanelGroup.vue

@@ -49,11 +49,34 @@ export default {
   components: {
     CountTo
   },
+  props: {
+    // 接收父组件传递的最新数据(推荐方案)
+    panelData: {
+      type: Object,
+      default: () => ({
+        success: 0,
+        fail: 0,
+        running: 0
+      })
+    }
+  },
   data() {
     return {
-      successCount: parseInt(localStorage.getItem('countSucTotal')),
-      failCount: parseInt(localStorage.getItem('countFailTotal')),
-      runningCount: parseInt(localStorage.getItem('countRunningTotal'))
+      // 初始化时给默认值 0,避免 NaN
+      successCount: parseInt(localStorage.getItem('countSucTotal')) || 0,
+      failCount: parseInt(localStorage.getItem('countFailTotal')) || 0,
+      runningCount: parseInt(localStorage.getItem('countRunningTotal')) || 0
+    }
+  },
+  watch: {
+    // 监听父组件传递的最新数据,实时更新
+    panelData: {
+      immediate: true,
+      handler(newVal) {
+        this.successCount = newVal.success || 0
+        this.failCount = newVal.fail || 0
+        this.runningCount = newVal.running || 0
+      }
     }
   },
   methods: {

+ 22 - 5
src/views/dashboard/admin/index.vue

@@ -2,7 +2,7 @@
   <div class="dashboard-editor-container">
     <!--<github-corner class="github-corner" />-->
 
-    <panel-group @handleSetLineChartData="handleSetLineChartData" />
+    <panel-group @handleSetLineChartData="handleSetLineChartData" :panel-data="panelData" />
 
     <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
       <line-chart :chart-data="lineChartData" />
@@ -75,7 +75,12 @@ export default {
   },
   data() {
     return {
-      lineChartData: lineChartData.chartInfo
+      lineChartData: lineChartData.chartInfo,
+      panelData: {
+        success: 0,
+        fail: 0,
+        running: 0
+      }
     }
   },
   created() {
@@ -91,9 +96,21 @@ export default {
         this.lineChartData.successData = content.triggerDayCountSucList
         this.lineChartData.failData = content.triggerDayCountFailList
         this.lineChartData.dayList = content.triggerDayList
-        localStorage.setItem('countSucTotal', content.triggerCountSucTotal)
-        localStorage.setItem('countRunningTotal', content.triggerCountRunningTotal)
-        localStorage.setItem('countFailTotal', content.triggerCountFailTotal)
+        // 存储到 localStorage
+        const sucTotal = content.triggerCountSucTotal || 0
+        const failTotal = content.triggerCountFailTotal || 0
+        const runningTotal = content.triggerCountRunningTotal || 0
+
+        localStorage.setItem('countSucTotal', sucTotal)
+        localStorage.setItem('countRunningTotal', runningTotal)
+        localStorage.setItem('countFailTotal', failTotal)
+
+        // 更新面板数据,传递给子组件
+        this.panelData = {
+          success: sucTotal,
+          fail: failTotal,
+          running: runningTotal
+        }
       })
     }
   }

+ 1 - 1
vue.config.js

@@ -22,7 +22,7 @@ module.exports = {
    * In most cases please use '/' !!!
    * Detail: https://cli.vuejs.org/config/#publicpath
    */
-  publicPath: '/',
+  publicPath: '',
   outputDir: 'dist',
   assetsDir: 'static',
   lintOnSave: process.env.NODE_ENV === 'development',