浏览代码

Merge branch 'master' of http://git.dayaedu.com/lex/dy-admin-live

wolyshaw 3 年之前
父节点
当前提交
a6f2b3bf65
共有 21 个文件被更改,包括 2373 次插入50 次删除
  1. 1 1
      index.html
  2. 1016 40
      package-lock.json
  3. 6 1
      package.json
  4. 二进制
      public/favicon.ico
  5. 二进制
      public/pwa-192x192.png
  6. 二进制
      public/pwa-512x512.png
  7. 6 3
      src/App.vue
  8. 75 0
      src/helpers/request.ts
  9. 5 1
      src/main.ts
  10. 12 0
      src/pages/404/index.tsx
  11. 12 0
      src/pages/500/index.tsx
  12. 12 0
      src/pages/home/index.tsx
  13. 0 0
      src/pages/login/index.module.less
  14. 25 0
      src/pages/login/index.tsx
  15. 86 0
      src/permission.ts
  16. 8 0
      src/router.ts
  17. 21 0
      src/routes.tsx
  18. 7 0
      src/state.ts
  19. 3 0
      src/utils/auth.ts
  20. 18 2
      vite.config.ts
  21. 1060 2
      yarn.lock

+ 1 - 1
index.html

@@ -4,7 +4,7 @@
     <meta charset="UTF-8" />
     <link rel="icon" href="/favicon.ico" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Vite App</title>
+    <title>管乐迷</title>
   </head>
   <body>
     <div id="app"></div>

文件差异内容过多而无法显示
+ 1016 - 40
package-lock.json


+ 6 - 1
package.json

@@ -10,7 +10,12 @@
   "dependencies": {
     "@rongcloud/imlib-next": "^5.1.1",
     "@rongcloud/plugin-rtc": "^5.3.1",
-    "vue": "^3.2.25"
+    "clean-deep": "^3.4.0",
+    "dayjs": "^1.10.7",
+    "element-plus": "^2.0.2",
+    "umi-request": "^1.4.0",
+    "vue": "^3.2.25",
+    "vue-router": "^4.0.12"
   },
   "devDependencies": {
     "@types/node": "^17.0.17",

二进制
public/favicon.ico


二进制
public/pwa-192x192.png


二进制
public/pwa-512x512.png


+ 6 - 3
src/App.vue

@@ -1,12 +1,15 @@
 <script setup lang="ts">
 // This starter template is using Vue 3 <script setup> SFCs
 // Check out https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup
-import HelloWorld from './components/HelloWorld.vue'
-import LiveBroadcast from './components/live-broadcast'
+// import HelloWorld from './components/HelloWorld.vue'
 </script>
 
 <template>
-  <LiveBroadcast/>
+  <!-- <img alt="Vue logo" src="./assets/logo.png" /> -->
+  <!-- <HelloWorld msg="Hello Vue 3 + TypeScript + Vite" /> -->
+  <router-view v-slot="{ Component }">
+    <component :is="Component" />
+  </router-view>
 </template>
 
 <style>

+ 75 - 0
src/helpers/request.ts

@@ -0,0 +1,75 @@
+import { extend } from 'umi-request'
+import { ElMessage } from 'element-plus'
+import cleanDeep from 'clean-deep'
+// import { setLogout } from 'src/actions/users'
+// import store from 'src/store'
+
+export interface SearchInitParams {
+  rows?: string | number;
+  page?: string | number;
+}
+
+export interface InitSearchRespones {
+  data: {
+    rows: any[],
+    [key: string]: any
+  },
+  [key: string]: any
+}
+
+const request = extend({
+  requestType: 'form',
+  timeout: 10000
+})
+
+request.interceptors.request.use((url, options: any) => {
+  const Authorization = (localStorage.getItem('Authorization') || '')
+  const tenantId = (localStorage.getItem('tenantId') || '')
+  const organId = (localStorage.getItem('organId') || '')
+  const authHeaders: any = {}
+  if (Authorization && !['/api-auth/usernameLogin', '/api-auth/smsLogin', '/api-auth/code/sendSms'].includes(url)) {
+    authHeaders.Authorization = Authorization
+  }
+  if (tenantId) {
+    authHeaders.tenantId = tenantId
+  }
+  if (organId) {
+    authHeaders.organId = organId
+  }
+  return {
+    url,
+    options: {
+      ...options,
+      params: cleanDeep(options.params),
+      headers: {
+        ...options.headers,
+        ...authHeaders
+      }
+    }
+  }
+})
+
+request.interceptors.response.use(async (res, options) => {
+  const url = new URL(res.url)
+  if (res.status > 299 || res.status < 200) {
+    const msg = '服务器错误,状态码' + res.status
+    ElMessage.error(msg)
+    throw new Error(msg)
+  }
+  const data = await res.clone().json()
+  if (data.code !== 200 && data.errCode !== 0) {
+    const msg = data.msg || '处理失败,请重试'
+    // const state: any = store.getState()
+    // if (data.code === 401 && state.user.status === 'login' && url.pathname !== '/api-auth/exit') {
+    //   const { dispatch }: any = store
+    //   dispatch(setLogout())
+    // }
+    if (!(data.code === 403 || data.code === 401)) {
+      ElMessage.error(msg)
+    }
+    throw new Error(msg)
+  }
+  return res
+})
+
+export default request

+ 5 - 1
src/main.ts

@@ -1,4 +1,8 @@
 import { createApp } from 'vue'
 import App from './App.vue'
+import router from './router'
 
-createApp(App).mount('#app')
+import './permission'
+
+createApp(App)
+  .use(router).mount('#app')

+ 12 - 0
src/pages/404/index.tsx

@@ -0,0 +1,12 @@
+import { defineComponent } from "vue";
+
+export default defineComponent({
+  render() {
+    return (
+      <div>
+        <h1>404</h1>
+        <p>Page not found.</p>
+      </div>
+    );
+  }
+})

+ 12 - 0
src/pages/500/index.tsx

@@ -0,0 +1,12 @@
+import { defineComponent } from "vue";
+
+export default defineComponent({
+  render() {
+    return (
+      <div>
+        <h1>500</h1>
+        <p>Internal server error.</p>
+      </div>
+    );
+  }
+})

+ 12 - 0
src/pages/home/index.tsx

@@ -0,0 +1,12 @@
+import { defineComponent } from "vue";
+
+export default defineComponent({
+  render() {
+    return (
+      <div>
+        <h1>Home</h1>
+        <p>This is the home page.</p>
+      </div>
+    )
+  }
+});

+ 0 - 0
src/pages/login/index.module.less


+ 25 - 0
src/pages/login/index.tsx

@@ -0,0 +1,25 @@
+import { defineComponent } from "vue"
+
+export default defineComponent({
+  render() {
+    return (
+      <div>
+        <div class="login-container">
+          <div class="login-title">
+          </div>
+          <div class="login-form">
+            <div class="login-input">
+              <input type="text" placeholder="用户名" />
+            </div>
+            <div class="login-input">
+              <input type="password" placeholder="密码" />
+            </div>
+            <div class="login-button">
+              <button>登录</button>
+            </div>
+          </div>
+        </div>
+      </div>
+    )
+  }
+})

+ 86 - 0
src/permission.ts

@@ -0,0 +1,86 @@
+// import Vue from 'vue'
+import router from "./router";
+// import store from './store'
+import { ElMessage } from "element-plus";
+// import NProgress from "nprogress"; // progress bar
+// import "nprogress/nprogress.css"; // progress bar style
+import { getToken } from "./utils/auth";
+// import getPageTitle from '@/utils/get-page-title'
+
+// NProgress.configure({ showSpinner: false }); // NProgress Configuration
+
+const whiteList = ["/login"]; // no redirect whitelist
+
+// let isOpen = false
+
+// router.onError((error: any) => {
+//   if (error instanceof Error) {
+//     const isChunkLoadFailed = error.name.indexOf('chunk')
+//     const targetPath = router.history.pending.fullPath;
+//     if (isChunkLoadFailed && !isOpen) {
+//       isOpen = true
+//       router.app.$confirm("网站有更新请点击确定刷新页面?", "更新提示", {
+//         confirmButtonText: "确定",
+//         cancelButtonText: "取消",
+//         type: "warning"
+//       })
+//         .then(() => {
+//           location.hash = targetPath
+//           window.location.reload()
+//         })
+//         .catch(() => {
+//           return
+//         });
+//     }
+//   }
+// });
+
+router.beforeEach(async (to, from, next) => {
+  // from.query = to.query
+  // start progress bar
+  // NProgress.start();
+  const hasToken = getToken();
+  if (hasToken) {
+    if (to.path === "/login") {
+      // 如果有tonken直接跳转到首页
+      next({ path: "/" });
+
+      // NProgress.done();
+    } else {
+      const hasGetUserInfo = store.getters.phone;
+      // 有名字 说明有用户信息 跳走
+      if (hasGetUserInfo) {
+        next();
+      } else {
+        try {
+          // 异步获取用户信息
+          await store.dispatch("user/getInfo");
+          
+          next({ ...to, replace: true });
+        } catch (error: any) {
+          // remove token and go to login page to re-login
+          await store.dispatch("user/resetToken");
+          if (error.msg) {
+            ElMessage.error(error.msg);
+          }
+          next(`/login`);
+          // NProgress.done();
+        }
+      }
+    }
+  } else {
+    /* has no token*/
+    if (whiteList.indexOf(to.path) !== -1) {
+      // in the free login whitelist, go directly
+      next();
+    } else {
+      // other pages that do not have permission to access are redirected to the login page.
+      next(`/login`);
+    }
+  }
+});
+
+router.afterEach(() => {
+  // finish progress bar
+  // NProgress.done();
+});

+ 8 - 0
src/router.ts

@@ -0,0 +1,8 @@
+import { createRouter, createWebHashHistory } from 'vue-router'
+// import VueRouter from 'vue-router'
+import routes from './routes'
+
+export default createRouter({
+  history: createWebHashHistory(),
+  routes
+})

+ 21 - 0
src/routes.tsx

@@ -0,0 +1,21 @@
+export default [
+  {
+    path: '/',
+    component: import(/* @vite-ignore */ `../src/pages/home/index`),
+  },
+  {
+    path: '/home',
+    component: import(/* @vite-ignore */ `../src/pages/home/index`),
+  },
+  {
+    path: '/login',
+    component: import(/* @vite-ignore */ `../src/pages/login/index`),
+  },
+  {
+    path: '/:pathMatch(.*)*',
+    component: import(/* @vite-ignore */ `../src/pages/404/index`),
+    meta: {
+      title: '404 Not Fund'
+    }
+  }
+]

+ 7 - 0
src/state.ts

@@ -0,0 +1,7 @@
+import { reactive } from 'vue'
+
+const state = reactive({
+  
+})
+
+export default state

+ 3 - 0
src/utils/auth.ts

@@ -0,0 +1,3 @@
+export const getToken = () => {
+  return localStorage.getItem('Authorization')
+}

+ 18 - 2
vite.config.ts

@@ -1,3 +1,4 @@
+const { resolve } = require('path')
 import { defineConfig } from "vite";
 import vue from "@vitejs/plugin-vue";
 import { VitePWA } from 'vite-plugin-pwa'
@@ -8,6 +9,12 @@ const proxyUrl = "https://test.dayaedu.com/"; // test 环境
 // https://vitejs.dev/config/
 export default defineConfig({
   base: "./",
+  // '/src': resolve(__dirname, './src')
+  resolve: {
+    alias: {
+      '@': resolve(__dirname, './src')
+    }
+  },
   plugins: [
     vue(),
     vueJsx(),
@@ -16,7 +23,7 @@ export default defineConfig({
       ignoreBrowserslistConfig: true,
     }),
     VitePWA({
-      injectRegister: 'networkfirst',
+      injectRegister: "auto",
       workbox: {
         cleanupOutdatedCaches: true
       },
@@ -38,6 +45,15 @@ export default defineConfig({
           },
         ],
       },
-    }),
+    })
   ],
+  server: {
+    cors: true,
+    proxy: {
+      '/api-web': {
+        target: proxyUrl,
+        changeOrigin: true
+      }
+    }
+  }
 });

文件差异内容过多而无法显示
+ 1060 - 2
yarn.lock


部分文件因为文件数量过多而无法显示